在Scala中将RDD列拆分为多个列

时间:2016-10-03 15:03:25

标签: 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转换为dataframe。有了这个,我能够使用方法withColumns

将字符串拆分成列

2 个答案:

答案 0 :(得分:1)

我认为你只需要逐一从列表中获取值并将它们放入元组中。试试这个

val result = RDD.map(x => (x._1, x._2, x._3(0), x._3(1), x._3(2)))

答案 1 :(得分:0)

如果您有类似的内容,

RDD[(String, Int, List[String])]

通常,您不应该尝试使用该List的元素作为列生成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, String)]

这将导致生成的RDD将其类型视为Any,您将拥有RDD[Any]。此Any类型会因运行时Erasure而限制您执行操作。

但是特殊情况下,您可以毫无问题地执行此操作 - 如果您知道每个列表的长度为known and same(在这种情况下可以说为3),

val yourRdd = rdd.map({
  case (s, i, s1 :: s2 :: s3 :: _) => (s, i, s1, s2, s3)
})

现在......如果不是这种特殊情况,你的列表可能有不同的未知大小......如果你想这样做...将未指定长度的列表转换为元组并不是一件容易的事情。做。至少,我想不出任何简单的方法。

我会建议你在没有非常坚实的理由的情况下避免尝试这样做。