我有一个Any
类型的RDD,例如:
Array(List(Mathematical Sciences, ListBuffer(applications, asymptotic, largest, enable, stochastic)))
我想将其转换为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()
我花了很长时间尝试没有成功
答案 0 :(得分:0)
您可以使用:
INDEX
但请注意,输入val result: RDD[(String, Seq[String])] =
rdd.map { case List(s0: String, s1: ListBuffer[String]) => (s0, s1) }
中与这些类型不匹配的任何记录(无法在编译时检查)会抛出RDD[Any]
。
答案 1 :(得分:0)
如问题所述,如果你有
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))
我希望答案很有帮助
答案 2 :(得分:0)
最后,它起作用了 我有一个警告,但工作
val rdd = sc.makeRDD(strList)
val result = rdd.map {case List(s0:String,s1:Seq [String])=> (s0,s1)}
:32:警告:非变量类型参数类型模式中的字符串Seq [String](Seq [String]的基础)未被选中,因为它被擦除消除 val result = rdd.map {case List(s0:String,s1:Seq [String])=> (s0,s1)} ^ 结果:org.apache.spark.rdd.RDD [(String,Seq [String])] = MapPartitionsRDD [1051] at map at:32
谢谢