在数据框的所有行上应用功能

时间:2019-08-09 10:24:05

标签: scala dataframe apache-spark

我想在DataFrame的所有行上应用一个函数。 示例:

|A  |B   |C   |
|1  |3   |5   |
|6  |2   |0   |
|8  |2   |7   |
|0  |9   |4   |


Myfunction(df)

Myfunction(df: DataFrame):{
//Apply sum of columns on each row
}

想要的输出:

1+3+5 = 9
6+2+0 = 8
...

请问Scala如何做到?我跟随this,但没有走运。

2 个答案:

答案 0 :(得分:0)

如果要将函数应用于数据框的每一行,请使用

Map。对于每个行,您都可以返回一个元组并创建一个新的RDD。

这非常适合使用数据集或RDD,但不适用于数据框。对于您的用例和Dataframe,我建议您只添加一列,并使用column对象执行您想要的操作。

// Using expr
df.withColumn("TOTAL", expr("A+B+C"))
// Using columns
df.withColumn("TOTAL", col("A")+col("B")+col("C"))
// Using dynamic selection of all columns
df.withColumn("TOTAL", df.colums.map(col).reduce((c1, c2) => c1 + c2))

在这种情况下,您会对this question非常感兴趣。 UDF也是一个很好的解决方案,here有更好的解释。

如果您不想保留源列,则可以将.withColumn(name, value)替换为.select(value.alias(name))

答案 1 :(得分:0)

很简单。您无需为此编写任何函数,您所要做的就是通过汇总所需的所有列来创建新列。

scala> df.show
+---+---+---+
|  A|  B|  C|
+---+---+---+
|  1|  2|  3|
|  1|  2|  4|
|  1|  2|  5|
+---+---+---+


scala> df.withColumn("sum",col("A")+col("B")+col("C")).show
+---+---+---+---+
|  A|  B|  C|sum|
+---+---+---+---+
|  1|  2|  3|  6|
|  1|  2|  4|  7|
|  1|  2|  5|  8|
+---+---+---+---+

编辑:

好吧,您可以在每一行上运行map函数,并使用行索引/字段名称获取总和。

scala> df.map(x=>x.getInt(0) + x.getInt(1) + x.getInt(2)).toDF("sum").show
+---+
|sum|
+---+
|  6|
|  7|
|  8|
+---+


scala> df.map(x=>x.getInt(x.fieldIndex("A")) + x.getInt(x.fieldIndex("B")) + x.getInt(x.fieldIndex("C"))).toDF("sum").show
+---+
|sum|
+---+
|  6|
|  7|
|  8|
+---+