SQL UPDATE语句转PySpark代码遇问题,求技术解决方案
SQL UPDATE转PySpark代码的问题解决
一、修复前两条UPDATE的PySpark代码
你写的代码出现所有STATUS值被更新为'NULL',主要是三个错误导致:
- 空值判断错误:SQL里的
IS NULL对应PySpark的isNull()方法,而非==''(空字符串和NULL是两种不同的空值类型) - 列名拼写错误:
HOLIDAY_TAKEN]多了一个右括号,正确列名应为HOLIDAY_TAKEN - 分支逻辑错误:
otherwise('NULL')会把所有不满足条件的记录强制改为字符串'NULL',正确逻辑应该保留原列的原始值
合并前两条SQL的正确PySpark代码如下:
import pyspark.sql.functions as F from pyspark.sql.functions import col # 逻辑:STATUS为NULL 或 HOLIDAY_TAKEN为NULL时,设置为"OTHER/MENTIONED",否则保留原STATUS值 df = df.withColumn( 'STATUS', F.when( col('STATUS').isNull() | col('HOLIDAY_TAKEN').isNull(), "OTHER/MENTIONED" ).otherwise(col('STATUS')) )
二、转换第三条UPDATE的PySpark代码
原SQL中EMPLOYEE_TABLE.LANGUAGE[]应为笔误,推测是普通字符串列LANGUAGE。对应的PySpark代码如下:
# 逻辑:当LANGUAGE不等于"ENGLISH"且FLAGYESNO为"Y"时,将LANGUAGE设为"ENGLISH",否则保留原值 df = df.withColumn( 'LANGUAGE', F.when( (col('LANGUAGE') != "ENGLISH") & (col('FLAGYESNO') == "Y"), "ENGLISH" ).otherwise(col('LANGUAGE')) )
如果LANGUAGE是数组类型,可根据实际需求调整判断逻辑(比如用array_contains等数组函数),但根据SQL写法更倾向于笔误,按普通字符串列处理即可。
内容的提问来源于stack exchange,提问作者BigData Lover
相关产品推荐
相关产品推荐

