如何使用Spark SQL检查数组内所有值是否符合指定范围条件?
解答
完全可以通过纯Spark SQL实现相同校验逻辑,Spark 2.4及以上版本原生支持数组类型的高阶函数,无需额外开发自定义UDF。
你给出的Presto语句核心逻辑是判断数组列中是否存在至少一个元素满足「值小于5 或 值大于10」,Spark SQL有两种等价实现方式:
- 与Presto写法思路对齐的版本:Spark中用
size函数对应Presto的cardinality做数组长度统计,filter高阶函数的lambda语法和Presto基本一致,写法如下:
size(filter(目标数组列名, x -> x < 5 or x > 10)) > 0
- 更简洁的原生语义写法:Spark内置了专门用于判断「数组是否存在元素满足指定条件」的
exists高阶函数,不需要先过滤再统计长度,语义更直观,写法如下:
exists(目标数组列名, x -> x < 5 or x > 10)
如果数组列可能存在NULL值,可以搭配coalesce做判空处理,比如需要将NULL数组统一判定为不满足条件时,写法为:
exists(coalesce(目标数组列名, array()), x -> x < 5 or x > 10)
若使用Spark 2.4以下的老旧版本,因没有内置高阶函数,需要通过
explode炸开数组再聚合统计的方式实现,目前主流生产环境的Spark版本均在2.4以上,直接使用高阶函数即可。
内容的提问来源于stack exchange,提问作者G_cy
相关产品推荐
相关产品推荐

