【发布时间】:2020-02-14 03:25:30
【问题描述】:
当“ID”列编号从 1 开始到最大值然后从 1 重置时,我正在尝试对列进行排名。
所以,前三行在“ID”上有一个连续的编号;因此这些应该与组等级 = 1 分组。第 4 行和第 5 行在另一个组中,组排名 = 2。
行按“rownum”列排序。我知道 row_number 窗口函数,但我认为我不能申请这个用例,因为没有常量窗口。我只能想到遍历数据框中的每一行,但不确定当数字重置为 1 时如何更新列。
val df = Seq( (1, 1), (2, 2), (3, 3), (4, 1), (5, 2), (6, 1), (7, 1), (8, 2) ).toDF("rownum", "ID") df.show()
【问题讨论】:
-
您了解超前滞后函数吗?你可以使用它,匹配上一个,检查上一行是1并且当前不是1,然后保持相同的排名,否则增加1。
-
我使用了前导窗口函数,得到了下一行的“ID”值;我也明白你所说的逻辑明智,但不确定如何在 Spark 中实现。 .withColumn("lead_col", lead(col("ID"), 1).over(Window.orderBy(col("rownum"))))
-
给我一些时间,会帮助你工作的。
标签: scala apache-spark apache-spark-sql grouping ranking