使用聚合值将列添加到DataFrame

时间:2018-02-02 06:05:58

标签: scala apache-spark spark-dataframe

我有一个DataFrame如下

profDF
+---+------------+---------+------+
| ID|        Name|      Occ|Salary|
+---+------------+---------+------+
|  1|       James|Detective| 30000|
|  2|      Victor| Salesman| 50000|
|  3|       Doris|      CEO| 20000|
+---+------------+---------+------+

我想添加一个新列,其中包含每个人的最高工资和薪水之间的差异。

+---+------------+---------+------+-------+
| ID|        Name|      Occ|Salary|DiffMax|
+---+------------+---------+------+-------+
|  1|       James|Detective| 30000|  20000|
|  2|      Victor| Salesman| 50000|      0|
|  3|       Doris|      CEO| 20000|  30000|
+---+------------+---------+------+-------+

执行此操作的一种方法是通过执行groupBy("ID")max创建另一个DF,然后将此DF与persDF加入“ID”,但groupBy不会给我所有行的最大工资。

另一种方法是使用withColumn("DiffMax", ...)。但我似乎无法找到withColumn的第二个参数,它会给我所需的结果。

有人可以帮我吗?我正在使用Spark-1.6.0

1 个答案:

答案 0 :(得分:4)

这是一种做法。找到max薪水,然后使用withColumn查找现有薪资与此max薪资之间的差异。

val maxSalary = profDF.agg(max(profDF("Salary"))).first().get(0)

profDF.withColumn("DiffMax", lit(maxSalary) - profDF("Salary")).show()

//output

+---+------+---------+------+-------+
| ID|  Name|      Occ|Salary|DiffMax|
+---+------+---------+------+-------+
|  1| James|Detective| 30000|20000.0|
|  2|Victor| Salesman| 50000|    0.0|
|  3| Doris|      CEO| 20000|30000.0|
+---+------+---------+------+-------+