Spark窗口函数row_number从0起始实现问题咨询
让Spark的row_number从0开始的正确做法
没问题,我来帮你搞定这个需求!Spark里的row_number()函数默认确实是从1开始计数的,你之前尝试的修改方式位置不对——不能直接在Window的定义后面减1,而是要对row_number()返回的结果做减法操作。
正确的代码写法
你只需要把row_number()的结果整体减去1就可以实现从0开始的序号了,修改后的代码如下:
import org.apache.spark.sql.expressions.Window import org.apache.spark.sql.functions.row_number val target2 = target1 .select("id","name","mark1","mark2","version") .withColumn("rank", row_number().over(Window.partitionBy("name","mark1","mark2").orderBy("id")) - 1)
为什么之前的写法不对?
你之前尝试的orderBy("id") -1是错误的,因为Window.partitionBy(...).orderBy(...)是用来定义窗口分区和排序规则的,这部分是一个窗口规范,不能直接在这里做数值运算。我们需要先让row_number()生成从1开始的序号,再对这个序号值执行减1操作,这样就能得到从0开始的结果了。
效果示例
假设你的target1数据是这样的:
| id | name | mark1 | mark2 | version |
|---|---|---|---|---|
| 1 | Alice | 80 | 90 | v1 |
| 2 | Alice | 80 | 90 | v2 |
| 3 | Bob | 75 | 85 | v1 |
运行修改后的代码后,target2的rank列就会是:
| id | name | mark1 | mark2 | version | rank |
|---|---|---|---|---|---|
| 1 | Alice | 80 | 90 | v1 | 0 |
| 2 | Alice | 80 | 90 | v2 | 1 |
| 3 | Bob | 75 | 85 | v1 | 0 |
内容的提问来源于stack exchange,提问作者Teju Priya
相关产品推荐
相关产品推荐

