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"))。 - 其他错误修正:
- 尝试代码中
withColumn('birth_year',year(col(EVENT))存在括号未闭合、列名错误(应为EVENT_YEAR而非birth_year)、EVENT未加引号的问题。 - 重复定义了
LOOK_FORWARD字段,需删除其中一个;同时原Scala代码用的是EVENT而非EVENT_DATE,需修正列名。 CONTINOUS_ENROL_END是拼写错误,对应原Scala代码的CONTINOUS_END。- 计算
AGE_AT_EVENT时,不能直接用字符串相减,必须用col()包裹字段名。
- 尝试代码中
内容的提问来源于stack exchange,提问作者user14269252
相关产品推荐
相关产品推荐

