基于Scala(将字符串转换为int)中的薪金列的AVG映射新列值



我在字符串中具有DEP代码,我想基于薪金列的AVG转换为数字。

dep code    salary     new-column
 abc          100            2
 bcd           90            1
 abc          110            2

如果该DEP的AVG工资更大,则新列值更大。

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

如果我正确理解您的问题,则可以使用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|
// +--------+------+-------+----+

最新更新