如何向Spark RDD添加新列?

9

我有一个RDD,它有非常多的列(例如,数百个),我该如何在这个RDD末尾添加一列?

例如,如果我的RDD如下所示:

    123, 523, 534, ..., 893
    536, 98, 1623, ..., 98472
    537, 89, 83640, ..., 9265
    7297, 98364, 9, ..., 735
    ......
    29, 94, 956, ..., 758

如何添加一列,其值为第二列和第三列的总和?

非常感谢。


请注意,数据框是不可变的。您无法更改一个数据框,但可以从旧数据框创建一个新的数据框... 请参见https://dev59.com/_V4b5IYBdhLWcg3wchXs - Paul
2个回答

9

您不必使用Tuple*对象来为RDD添加新列。

可以通过映射每一行来完成,取其原始内容加上要附加的元素,例如:

val rdd = ...
val withAppendedColumnsRdd = rdd.map(row => {
  val originalColumns = row.toSeq.toList
  val secondColValue = originalColumns(1).asInstanceOf[Int]
  val thirdColValue = originalColumns(2).asInstanceOf[Int]
  val newColumnValue = secondColValue + thirdColValue 
  Row.fromSeq(originalColumns :+ newColumnValue)
  // Row.fromSeq(originalColumns ++ List(newColumnValue1, newColumnValue2, ...)) // or add several new columns
})

4

您有一个由元组4组成的RDD,应用map并将其转换为元组5。

val rddTuple4RDD = ...........
val rddTuple5RDD = rddTuple4RDD.map(r=> Tuple5(rddTuple4._1, rddTuple4._2, rddTuple4._3, rddTuple4._4, rddTuple4._2 + rddTuple4._3))

4
谢谢您。问题在于我的真实数据中有很多列(例如数百列),不容易枚举所有列的值。有没有一种处理众多列的方法? - Carter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接