SQL转PySpark:如何按条件更新CGPA列并执行除法操作?
正确的PySpark实现方案
先明确你写的代码里的几个核心问题:
- 逻辑判断误用了
&(表示“且”),但需求是或逻辑,应该用| - 括号完全不匹配:
when的条件、结果部分都未闭合,otherwise的调用位置错误 - 列引用方式混乱,混用了
col()、df.CGPA、df['CGPA'],建议统一用F.col()规范写法
另外原SQL中CGPA是按字符串类型做比较,实际场景中CGPA更可能是数值类型,下面分两种情况给出正确实现:
情况1:CGPA为字符串类型(与原SQL逻辑完全对齐)
import pyspark.sql.functions as F # 更新CGPA列 df = df.withColumn( 'CGPA', F.when( (F.col('CGPA') > '5') | (F.col('CGPA') == '100'), # 先转数值类型再计算,最后可按需转回字符串 F.col('CGPA').cast('double') / 25 ).otherwise(F.col('CGPA')) ) # 若需要将结果转回字符串类型 df = df.withColumn('CGPA', F.col('CGPA').cast('string'))
情况2:CGPA为数值类型(更符合实际业务场景)
import pyspark.sql.functions as F df = df.withColumn( 'CGPA', F.when( (F.col('CGPA') > 5) | (F.col('CGPA') == 100), F.col('CGPA') / 25 ).otherwise(F.col('CGPA')) )
关键说明
- PySpark中
when的标准语法是F.when(判断条件, 满足条件的结果).otherwise(不满足条件的结果),必须保证括号完整匹配 - 逻辑或用
|、逻辑且用&,每个条件都要用括号包裹,避免优先级导致的逻辑错误 - 字符串类型的数值必须先转成数值类型再做运算,否则会出现字符串拼接或错误的比较结果
内容的提问来源于stack exchange,提问作者BigData Lover
相关产品推荐
相关产品推荐

