我有这种形式的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
将字符串拆分成列答案 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)
})
现在......如果不是这种特殊情况,你的列表可能有不同的未知大小......如果你想这样做...将未指定长度的列表转换为元组并不是一件容易的事情。做。至少,我想不出任何简单的方法。
我会建议你在没有非常坚实的理由的情况下避免尝试这样做。