将Spark SQL高阶函数Lambda变量传入自定义SQL UDF时出错
解决Spark SQL中transform调用自定义SQL UDF的AnalysisException错误
当在Spark SQL的transform(即array_transform)函数中调用自定义SQL UDF时,若遇到Resolved attribute(s) val missing这类解析错误,可通过以下方式修复:
修正后的调用语句
将UDF调用用括号包裹,帮助SQL解析器正确识别lambda变量的作用域:
select transform(col1, val -> (printStr(val))) from values
问题原因
在Spark 3.2.1(Databricks Runtime 10.4 LTS)的SQL解析逻辑中,lambda表达式内部直接调用自定义UDF时,解析器无法正确区分lambda参数(如这里的val)与表列,误将lambda变量当作表的属性列处理,从而抛出解析异常。添加括号后,解析器能明确这是lambda内部的表达式,正确绑定lambda变量。
完整验证步骤
- 重新创建UDF(确保定义正确):
CREATE or REPLACE FUNCTION printStr(str String ) RETURNS STRING COMMENT 'print given string' LANGUAGE SQL RETURN str
- 创建测试临时视图:
CREATE or REPLACE TEMP VIEW values AS select * from values (array("1","2","3")), (array("2","3","5")), (array("3","44"))
- 执行修正后的查询语句,即可正常返回转换后的数组结果。
内容的提问来源于stack exchange,提问作者nrk
相关产品推荐
相关产品推荐

