我有一个部门代码的字符串,我想根据工资列的平均值将其转换为数字。
dep code salary new-column abc 100 2 bcd 90 1 abc 110 2
如果某个部门的平均工资更高,那么新列的值会更大。
注意 – 我已经将所有CSV文件数据转换为数据框架。
回答:
如果我正确理解了您的问题,您可以使用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.Windowdf.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|// +--------+------+-------+----+