Spark SQL中使用CASE语句报错,请求排查修正
问题排查与修正
直接列你SQL里的问题,再给出修正后的代码:
- JOIN条件语法错误:
AND ca.city cr.city缺少等于号,应该改为AND ca.city = cr.city,这是导致SQL解析失败的核心问题之一。 - 逻辑运算符使用错误:Spark SQL遵循标准SQL语法,逻辑与/或需用
AND/OR,而非&&/||(部分环境虽兼容,但不规范且易引发问题)。 - 逻辑条件优先级隐患:需要明确分组条件,比如Approved的两个要求必须同时满足,Rejected的两个要求满足其一即可,用括号包裹每组条件能避免运算符优先级导致的逻辑错误。
- CASE分支未覆盖全场景:当前CASE只处理了
cred_limit小于或大于消费总额的情况,未处理等于的场景,根据需求可默认归为Rejected(若有其他需求可自行调整)。
修正后的完整代码:
val resDF = spark.sql(""" SELECT ssn, cust_name, CASE WHEN defaulter_flag ILIKE 'n' AND cred_limit < (credit_spent1 + credit_spent2 + credit_spent3) THEN 'Approved' WHEN defaulter_flag ILIKE 'y' OR cred_limit > (credit_spent1 + credit_spent2 + credit_spent3) THEN 'Rejected' ELSE 'Rejected' -- 处理cred_limit等于消费总额的情况 END AS status FROM credapp as ca JOIN custsref as cr ON ca.cust_name = cr.cust_name AND ca.dob = cr.dob AND ca.ssn = cr.ssn AND ca.city = cr.city AND ca.state = cr.state AND ca.zipcode = cr.zipcode """)
补充:如果defaulter_flag是布尔类型而非字符串,直接用defaulter_flag = false代替ILIKE 'n'会更高效,根据你的写法判断是字符串类型,所以保留ILIKE即可。
内容的提问来源于stack exchange,提问作者Goutham18
相关产品推荐
相关产品推荐

