我在字符串中有dep代码,我希望根据avg of salary column将其转换为数字。
mdc-simple-menu
如果该dep的平均工资更高,则新列值更高。
注意 - 我已将所有csv文件数据转换为数据帧。
答案 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|
// +--------+------+-------+----+