Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 在Scala中将RDD列拆分为多个列_List_Scala_Rdd - Fatal编程技术网

List 在Scala中将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

我有此表格的RDD:

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