根据scala中的avg of salary列映射新列值(将字符串转换为int)

时间:2018-02-20 21:26:44

标签: scala apache-spark dataframe machine-learning spark-dataframe

我在字符串中有dep代码,我希望根据avg of salary column将其转换为数字。

mdc-simple-menu
如果该dep的平均工资更高,则

新列值更高。

注意 - 我已将所有csv文件数据转换为数据帧。

1 个答案:

答案 0 :(得分:1)

如果我正确理解您的问题,您可以使用rank()窗口功能:

val df = Seq(
  ("abc", 100), ("bcd", 90), ("abc", 110),
  ("eee", 90), ("eee", 100), ("fff", 95)
).toDF("dep code", "salary")

import org.apache.spark.sql.expressions.Window

df.withColumn("average", avg($"salary").over(Window.partitionBy($"dep code"))).
  withColumn("rank", rank.over(Window.orderBy($"average"))).
  show
// +-------+------+-------+----+
// |dep code|salary|average|rank|
// +--------+------+-------+----+
// |     bcd|    90|   90.0|   1|
// |     fff|    95|   95.0|   2|
// |     eee|    90|   95.0|   2|
// |     eee|   100|   95.0|   2|
// |     abc|   100|  105.0|   5|
// |     abc|   110|  105.0|   5|
// +--------+------+-------+----+

如果您希望拥有连续的排名,请使用dense_rank()

df.withColumn("average", avg($"salary").over(Window.partitionBy($"dep code"))).
  withColumn("rank", dense_rank.over(Window.orderBy($"average"))).
  show
// +--------+------+-------+----+
// |dep code|salary|average|rank|
// +--------+------+-------+----+
// |     bcd|    90|   90.0|   1|
// |     fff|    95|   95.0|   2|
// |     eee|    90|   95.0|   2|
// |     eee|   100|   95.0|   2|
// |     abc|   100|  105.0|   3|
// |     abc|   110|  105.0|   3|
// +--------+------+-------+----+