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

Scala转PySpark代码求助:WHERE子句及日期处理语法转换问题

Scala转PySpark代码修正与说明

原Scala代码

val df= df1.join(df2,Seq("PA_ID"))
.where('EVENT>='CONTINOUS_START && 'EVENT<= 'CONTINOUS_END) //>= and <= instead of > and <
.withColumn("EVENT",'EVENT.cast("date"))
.withColumn("EVENT_YEAR",year('EVENT.cast("date")))
.withColumn("AGE_AT_EVENT", 'EVENT_YEAR - 'BIRTH_YEAR)
.withColumn("LOOK_FORWARD", datediff('CONTINOUS_END,'EVENT_DATE))
.withColumn("LOOK_BACK", datediff('EVENT, 'CONTINOUS_START))

你的PySpark尝试代码

df = df1.join(df2,["PA_ID"])
.withColumn("EVENT",col("EVENT").cast("date"))
.withColumn('birth_year',year(col(EVENT))
.withColumn("AGE_AT_EVENT", 'EVENT_YEAR - 'BIRTH_YEAR)
.withColumn("LOOK_FORWARD", datediff('CONTINOUS_ENROL_END,'EVENT_DATE))
.withColumn("LOOK_FORWARD", datediff(col("CONTINOUS_END"),col("EVENT_DATE")))
.withColumn("LOOK_BACK", datediff(col("EVENT"),col("CONTINOUS_START")))

修正后的PySpark代码

先导入必要的函数:

from pyspark.sql.functions import col, year, datediff

完整代码:

df = df1.join(df2, ["PA_ID"]) \
    .where((col("EVENT") >= col("CONTINOUS_START")) & (col("EVENT") <= col("CONTINOUS_END"))) \
    .withColumn("EVENT", col("EVENT").cast("date")) \
    .withColumn("EVENT_YEAR", year(col("EVENT"))) \
    .withColumn("AGE_AT_EVENT", col("EVENT_YEAR") - col("BIRTH_YEAR")) \
    .withColumn("LOOK_FORWARD", datediff(col("CONTINOUS_END"), col("EVENT"))) \
    .withColumn("LOOK_BACK", datediff(col("EVENT"), col("CONTINOUS_START")))

关键修正点说明

  • WHERE子句转换:
    Scala中的'语法对应PySpark的col()函数,逻辑运算符&&要替换为&,且每个条件需加括号避免优先级问题。也可以用更简洁的写法:.where(col("EVENT").between(col("CONTINOUS_START"), col("CONTINOUS_END"))),效果和原代码一致。
  • EVENT_YEAR字段处理:
    原Scala代码的year('EVENT.cast("date")),在PySpark中,因为前面已将EVENT转为date类型,直接用year(col("EVENT"))即可;如果要一步完成类型转换和取年份,也可写成year(col("EVENT").cast("date"))。
  • 其他错误修正:
    1. 尝试代码中withColumn('birth_year',year(col(EVENT))存在括号未闭合、列名错误(应为EVENT_YEAR而非birth_year)、EVENT未加引号的问题。
    2. 重复定义了LOOK_FORWARD字段,需删除其中一个;同时原Scala代码用的是EVENT而非EVENT_DATE,需修正列名。
    3. CONTINOUS_ENROL_END是拼写错误,对应原Scala代码的CONTINOUS_END。
    4. 计算AGE_AT_EVENT时,不能直接用字符串相减,必须用col()包裹字段名。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 00:10:16