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

PySpark使用Window和row_number时报SyntaxError语法错误求助

PySpark代码语法错误定位与修复

你遇到的SyntaxError: unexpected EOF while parsing报错本质是括号未闭合+方法调用位置错误,两种写法的具体问题如下:

两类写法的共性错误

  • 括号完全不匹配:两个版本里f.row_number().over(...)的右括号都缺失,Python解析代码时一直找不到和左括号匹配的闭合符号,读到代码末尾就会抛出EOF语法错误。
  • desc()调用对象错误:Window.partitionBy(...).orderBy(...)返回的Window窗口对象没有desc()方法,降序排序需要作用在orderBy里的具体字段上,而非窗口对象本身。
  • 链式调用断裂:因为over()的括号没闭合,后续的.filter()、.drop()会被Python识别为over()方法的传入参数,而非DataFrame的链式转换方法,就算括号补上也会报参数错误。

第一种写法的额外问题

第一版代码中window.desc()的调用完全无效,Window对象不支持该方法,运行时会直接抛出AttributeError。

第二种写法的额外问题

续行符\位置错误,被放在了withColumn()方法的参数括号内部,进一步导致Python无法正确识别链式调用的边界。

正确可运行代码

写法1:预定义窗口对象

from pyspark.sql import Window
from pyspark.sql import functions as f

# 降序排序直接写在orderBy的字段上
window = Window.partitionBy(["RECEIPT_DT","nummer","CODE"]).orderBy(f.col("Year").desc())

result = df.withColumn('row', f.row_number().over(window)) \
           .filter(f.col('row') == 1) \
           .drop('row')

写法2:链式内联窗口

用外层圆括号包裹整个DataFrame链式调用时,不需要手动加\续行,Python会自动识别括号内的换行,注意每层方法的括号要成对闭合:

result = (df
    .withColumn('row', f.row_number().over(
        Window.partitionBy(["RECEIPT_DT","nummer","CODE"])
              .orderBy(f.col("Year").desc())
    )) # 必须闭合over()和withColumn()的两层右括号
    .filter(f.col('row') == 1)
    .drop("row")
)

排查提示

遇到unexpected EOF while parsing报错时,优先从报错位置往前逐行检查:

  • 所有左括号(、左引号'/"是否有对应的右闭合符号
  • 续行符\是否放在了代码行的最末尾,后面不要跟任何空格或注释
  • 链式调用的每个方法是否正确闭合了上一层的括号

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 05:09:25