我想在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,但没有走运。
答案 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|
+---+