You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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数据是这样的:

idnamemark1mark2version
1Alice8090v1
2Alice8090v2
3Bob7585v1

运行修改后的代码后,target2的rank列就会是:

idnamemark1mark2versionrank
1Alice8090v10
2Alice8090v21
3Bob7585v10

内容的提问来源于stack exchange,提问作者Teju Priya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:20:01