Spark Dataset数组列在UDF调用中引用报错问题咨询
解决Spark中数组元素引用导致的分析异常问题
你遇到的问题根源在于:在Spark Dataset API的列表达式里,直接用$"myarr[0]"的写法是错误的——Spark会把它当成一个名为myarr[0]的列名,而非访问myarr数组的第一个元素,自然找不到对应列,从而抛出分析异常。
针对你的场景,正确的数组元素访问方式有两种:
方法1:使用列的apply方法
这是最简洁的写法,直接通过括号索引数组元素:
import org.apache.spark.sql.functions.{callUDF, size} // 若你习惯用callUDF filter(callUDF("size", $"myarr"(0)) > 0 && callUDF("size", $"myarr"(1)) > 0) // 更推荐直接用Spark内置的size函数,无需callUDF filter(size($"myarr"(0)) > 0 && size($"myarr"(1)) > 0)
方法2:使用getItem方法
这是语义更明确的数组元素访问API:
filter(size($"myarr".getItem(0)) > 0 && size($"myarr".getItem(1)) > 0)
另外补充:如果是用Spark SQL字符串查询,myarr[0]这种写法是支持的,示例如下:
spark.sql(""" SELECT * FROM your_table WHERE size(myarr[0]) > 0 AND size(myarr[1]) > 0 """)
这样就能正确过滤出myarr中两个map元素都不为空的行了。
内容的提问来源于stack exchange,提问作者Maayan
相关产品推荐
相关产品推荐

