我有一个带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()
我花了很长时间才尝试没有成功
您可以使用:
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]]
您可以将其转换为所需的数据类型
res0: org.apache.spark.rdd.RDD[(String, Seq[String])]
通过简单地使用map
并将dataTypes转换为
rdd.map(x => (x(0).toString, x(1).asInstanceOf[ListBuffer[String]].toSeq))
我希望答案是有帮助的
最后,它有效,我有一个警告,但工作
瓦尔EET = 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
谢谢