Spark Scala中transform表达式触发'>'意外输入ParseException
Spark SQL transform函数语法错误修复
问题背景
执行Spark DataFrame聚合后使用transform函数生成indicator列时,报错提示->操作符中的'>'为意外输入,使用环境为Scala 2.11.8、Spark 3.1.2(注:推测原版本号3.17.2为笔误)。
报错原因
Spark 3.x早期版本的SQL解析器对transform函数的lambda表达式语法要求更严格,直接使用x -> ...的写法会导致解析器无法正确识别箭头符号,引发语法错误。
修复方案
方案1:给lambda参数添加括号
通过给lambda的参数部分加上括号,明确语法边界,让解析器正确识别箭头表达式:
val transformExpr = "transform(array, (x) -> array_contains(x, 'CIBASE') and array_contains(x, 'ACTIVE'))"
方案2:使用CASE表达式显式定义逻辑
如果方案1仍存在兼容问题,可以改用CASE WHEN语法替代箭头表达式,写法更兼容:
val transformExpr = "transform(array, x -> CASE WHEN array_contains(x, 'CIBASE') AND array_contains(x, 'ACTIVE') THEN true ELSE false END)"
效果说明
修改后,indicator列会生成一个布尔数组,其中每个元素对应原array列中的子数组是否同时包含'CIBASE'(来自InstalledOffer_applicationSource)和'ACTIVE'(来自InstalledOffer_standardStatus)。
内容的提问来源于stack exchange,提问作者mr.Penguin
相关产品推荐
相关产品推荐

