List 在Scala中将RDD列拆分为多个列
我有此表格的RDD:List 在Scala中将RDD列拆分为多个列,list,scala,rdd,List,Scala,Rdd,我有此表格的RDD: org.apache.spark.rdd.RDD[(String, Int, Array[String])] 这是RDD的第一个元素: (001, 5, Array(a, b, c)) 我想把这个列表分成几列,因为它是用逗号分隔的,预期的输出是: (001, 5, a, b, c) 有什么帮助吗 解决方案: 我终于解决了这个问题: 我所做的是将数组组成一个完整的字符串,其中包含: mkstring(“,”) 然后,将rdd转换为数据帧。这样,我就可以使用withCol
org.apache.spark.rdd.RDD[(String, Int, Array[String])]
这是RDD的第一个元素:
(001, 5, Array(a, b, c))
我想把这个列表分成几列,因为它是用逗号分隔的,预期的输出是:
(001, 5, a, b, c)
有什么帮助吗
解决方案:
我终于解决了这个问题:
我所做的是将数组组成一个完整的字符串,其中包含:
mkstring(“,”)
然后,将rdd转换为数据帧。这样,我就可以使用withColumns方法将字符串拆分为列了。我认为您只需要从列表中逐个获取值,然后将它们放入元组中。试试这个
val result = RDD.map(x => (x._1, x._2, x._3(0), x._3(1), x._3(2)))
如果你有这样的东西
RDD[(String, Int, List[String])]
一般情况下,您不应该尝试生成一个RDD,该列表中的元素作为列
原因是Scala是一种严格类型化的语言,您的RDD[T]
需要是RDD
类型的T
现在让我们假设您的RDD只有以下两行(元素)具有不同长度的列表
("001", 5, List("a", "b", "c"))
("002", 5, List("a", "b", "c", "d"))
现在你可以看到。。。第一行需要一个RDD[(String,Int,String,String,String)]
但是第二行需要一个RDD[(String,Int,String,String,String)]
这将导致生成的RDD将其类型视为Any
,您将拥有RDD[Any]
。这种Any
类型将进一步限制您执行操作,因为在运行时Erasure
但在特殊情况下,如果您知道每个列表都有已知且相同的长度(在本例中为3),则可以毫无问题地执行此操作
现在。。。如果不是这种特殊情况,您的列表可以有不同的未知大小。。。如果你想这么做。。。将未指定长度的列表转换为元组并非易事。至少,我想不出任何简单的方法来做到这一点
我会建议您避免在没有非常确凿的理由的情况下尝试这样做。
yourRDD.map{case(I,n,List(a,b,c))=>(I,n,a,b,c))
可能但您并不完全清楚您的意思,因为元素不是“用逗号分隔的”,这只是它们的打印方式。是的,这是一种方式,但如果列表中有大量元素,该怎么办?是否有方法遍历它们并返回它们?列表中的元素数量是否固定?@Thabby07是的,列表中有298项。@Thabby07据我所知,这是不可能的,因为scala ha中的元组这是一个有限的数字22,这意味着您的RDD中最多只能有22列(T,T,T,T,T,T,T…)。实际上,我不建议将列表中的元素拆分为RDD中的列,这是Sarvesh提到的原因。
val yourRdd = rdd.map({
case (s, i, s1 :: s2 :: s3 :: _) => (s, i, s1, s2, s3)
})