PySpark SQL使用CASE WHEN创建新列报错的解决咨询
解决Spark SQL CASE语句的语法错误问题
我来帮你搞定这个报错问题,你遇到的错误完全是因为CASE表达式的写法不符合Spark SQL的语法规范,咱们一步步捋清楚:
错误原因分析
你原来的CASE写法犯了两个关键错误:
- 在THEN子句里错误使用赋值语法:你写的
then high_income_encoded = 0.162是不对的,CASE表达式的作用是返回一个具体数值,而不是在这里给列赋值。正确的做法是直接返回对应数值,最后用as指定新列的名字。 - 多余的双引号包裹列名:Spark SQL中,只要列名没有空格或特殊字符,不需要用双引号包裹,反而会导致解析器识别错误。
正确的SQL写法
把CASE表达式改成直接返回对应数值的形式,最后用as high_income_encoded命名新列,同时确保覆盖所有aml_cluster_id(0-3)和high_income(0-1)的组合,也可以加一个else兜底处理未覆盖的特殊情况:
q = """ SELECT *, CASE WHEN aml_cluster_id = 0 AND high_income = 1 THEN 0.162 WHEN aml_cluster_id = 0 AND high_income = 0 THEN 0.337 WHEN aml_cluster_id = 1 AND high_income = 1 THEN 0.049 WHEN aml_cluster_id = 1 AND high_income = 0 THEN 0.402 WHEN aml_cluster_id = 2 AND high_income = 1 THEN 0.005 WHEN aml_cluster_id = 2 AND high_income = 0 THEN 0.0 WHEN aml_cluster_id = 3 AND high_income = 1 THEN 0.023 WHEN aml_cluster_id = 3 AND high_income = 0 THEN 0.022 -- 兜底处理意外情况,可根据需求调整 ELSE 0.0 END AS high_income_encoded FROM event_rate_holder """
执行验证
运行spark.sql(q).show(10)就能得到预期结果,前10行的high_income_encoded列会正确显示对应的数值:
+-----------+--------------+-------------------+ |high_income|aml_cluster_id|high_income_encoded| +-----------+--------------+-------------------+ | 0| 0| 0.337| | 0| 0| 0.337| | 0| 1| 0.402| | 0| 1| 0.402| | 0| 0| 0.337| | 0| 0| 0.337| | 0| 1| 0.402| | 1| 1| 0.049| | 1| 0| 0.162| | 1| 0| 0.162| +-----------+--------------+-------------------+
内容的提问来源于stack exchange,提问作者Clock Slave
相关产品推荐
相关产品推荐

