我在字符串中具有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|
// +--------+------+-------+----+