如何在Spark的select()中正确使用when()实现列值转换
正确实现语法
对照你给出的SQL逻辑,调整后的PySpark代码可以直接实现相同效果:
# 注:如果代码中已经导入过pyspark.sql.functions as sf,这行可省略 import pyspark.sql.functions as sf x = ( spark.table('my_table') .select( # 修正原代码中date、id两列之间漏写逗号的问题 'date', 'id', # 链式拼接所有分支条件,最后设置列别名对齐SQL的 end as name sf.when(sf.col('name') == 'x', 'One') .when(sf.col('name') == 'y', 'Two') .when(sf.col('name') == 'z', 'Three') .alias('name') ) )
原代码的常见语法问题说明
- Python基础语法错误:原代码里写的
'date' 'id',两个相邻字符串字面量没有逗号分隔,会被Python自动拼接为'dateid',完全无法选中date、id两个独立列 when的调用逻辑错误:PySpark的多分支判断不能把多个独立的.when()零散放在select的参数列表里,需要以sf.when(首个判断条件, 首个返回值)作为链式调用起点,后续的所有.when()都接在前一个分支表达式后面,最终拼接成一个完整的列对象作为select的独立参数传入- 链式调用缺少主体:原代码直接以
.when(...)开头,没有对应的调用主体,会直接触发语法错误
补充说明
- 如果需要给不满足所有分支的场景设置默认返回值,可在最后一个
.when()后接.otherwise('自定义默认值'),和SQL中case when ... else 默认值的逻辑完全一致 - 不手动设置
.alias('name')的话,新生成的分支列会使用默认的长表达式名称,和SQL输出的列名不一致,需要手动设置别名对齐
内容的提问来源于stack exchange,提问作者stackq
相关产品推荐
相关产品推荐

