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

问题描述 投票:0回答:3

我有一个带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()

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

scala apache-spark rdd
3个回答
0
投票

您可以使用:

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

但请注意,输入RDD[Any]中与这些类型不匹配的任何记录(在编译时无法检查)会抛出scala.MatchError


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]]

您可以将其转换为所需的数据类型

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

通过简单地使用map并将dataTypes转换为

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

我希望答案是有帮助的


0
投票

最后,它有效,我有一个警告,但工作

瓦尔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

谢谢

© www.soinside.com 2019 - 2024. All rights reserved.