将RDD数组[Any] =数组(List([String],ListBuffer([string]))转换为RDD(String,Seq [String])

时间:2018-03-03 23:54:27

标签: scala apache-spark rdd

我有一个Any类型的RDD,例如:

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

我想将其转换为RDD[(String, Seq[String])]

类型的RDD

我试过了:

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()

我花了很长时间尝试没有成功

3 个答案:

答案 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

谢谢