簡體   English   中英

將RDD Array [Any] = Array(List([String],ListBuffer([string]))轉換為RDD(String,Seq [String])

[英]convert RDD Array[Any] = Array(List([String], ListBuffer([string])) to RDD(String, Seq[String])

我有Any類型的RDD,例如:

Array(List(Mathematical Sciences, ListBuffer(applications, asymptotic, largest, enable, stochastic)))

我想將其轉換為RDD類型的RDD[(String, Seq[String])]

我試過了:

val rdd = sc.makeRDD(strList)
case class X(titleId: String, terms: List[String])

val df = rdd.map { case Array(s0, s1) => X(s0, s1) }.toDF()

我花了很長時間嘗試沒有成功

您可以使用:

val result: RDD[(String, Seq[String])] = 
  rdd.map { case List(s0: String, s1: ListBuffer[String]) =>  (s0, s1) }

但是請注意,輸入RDD[Any]中與這些類型不匹配(在編譯時無法檢查)的任何記錄都將引發scala.MatchError

如問題中所述,如果您有

val strList = Array(List("Mathematical Sciences", ListBuffer("applications", "asymptotic", "largest", "enable", "stochastic")))
val rdd = sc.makeRDD(strList)

屬於以下dataTypes

rdd: org.apache.spark.rdd.RDD[List[java.io.Serializable]]

您可以將其轉換為所需的dataTypes

res0: org.apache.spark.rdd.RDD[(String, Seq[String])]

通過簡單地使用map 並將dataTypes轉換

rdd.map(x => (x(0).toString, x(1).asInstanceOf[ListBuffer[String]].toSeq))

我希望答案是有幫助的

最后,它奏效了,我有一個警告,但奏效了

val rdd = sc.makeRDD(strList)

val result = rdd.map {case List(s0:String,s1:Seq [String])=>(s0,s1)}

:32:警告:類型模式Seq [String](Seq [String]的基礎)中的非變量類型參數String未選中,因為它已通過擦除val結果= rdd.map {case List(s0:String,s1 :Seq [String])=>(s0,s1)} ^結果:org.apache.spark.rdd.RDD [(String,Seq [String])] = MapPartitionsRDD [1051]在地圖上的:32

謝謝

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM