【发布时间】:2017-11-27 13:03:41
【问题描述】:
假设我有一个包含多列的数据框,我想迭代每一列,进行一些计算并更新该列。有什么好办法吗?
【问题讨论】:
标签: scala apache-spark dataframe bigdata
假设我有一个包含多列的数据框,我想迭代每一列,进行一些计算并更新该列。有什么好办法吗?
【问题讨论】:
标签: scala apache-spark dataframe bigdata
@rogue-one 已经回答了您的问题,您只需修改答案以满足您的要求。
以下是不使用Window函数的解决方案。
val df = List(
(2, 28),
(1, 21),
(7, 42)
).toDF("col1", "col2")
你的输入 dataframe 应该是这样的
+----+----+
|col1|col2|
+----+----+
|2 |28 |
|1 |21 |
|7 |42 |
+----+----+
现在申请columnValue/sumOfColumnValues做为
val columnsModify = df.columns.map(col).map(colName => {
val total = df.select(sum(colName)).first().get(0)
colName/total as(s"${colName}")
})
df.select(columnsModify: _*).show(false)
你应该得到输出
+----+-------------------+
|col1|col2 |
+----+-------------------+
|0.2 |0.3076923076923077 |
|0.1 |0.23076923076923078|
|0.7 |0.46153846153846156|
+----+-------------------+
【讨论】:
更新 在下面的示例中,我有一个包含两个整数列 c1 和 c2 的数据框。每列的值除以其列的总和。
import org.apache.spark.sql.expressions.Window
val df = Seq((1,15), (2,20), (3,30)).toDF("c1","c2")
val result = df.columns.foldLeft(df)((acc, colname) => acc.withColumn(colname, sum(acc(colname)).over(Window.orderBy(lit(1)))/acc(colname)))
输出:
scala> result.show()
+---+------------------+
| c1| c2|
+---+------------------+
|6.0| 4.333333333333333|
|3.0| 3.25|
|2.0|2.1666666666666665|
+---+------------------+
【讨论】: