Spark中使用正则表达式查询多维数组数据
解决嵌套数组的过滤需求
要筛选出data数组中至少有一个元素的id以test_加数字开头的记录,你可以利用Spark的数组遍历函数结合正则匹配来实现,具体方案如下:
Spark SQL 实现
直接通过SQL语句过滤,两种写法可选:
方式1:使用UNNEST + EXISTS
SELECT * FROM your_table WHERE EXISTS( SELECT 1 FROM UNNEST(data) AS element WHERE element.id RLIKE '^test_\\d+' )
方式2:使用array_exists(Spark 3.0+支持)
SELECT * FROM your_table WHERE array_exists(data, elem => elem.id RLIKE '^test_\\d+')
Scala DataFrame API 实现
如果用Scala代码操作DataFrame:
import org.apache.spark.sql.functions._ // 假设originalDF是你的源DataFrame val filteredDF = originalDF.filter( array_exists(col("data"), elem => elem.getField("id").rlike("^test_\\d+")) )
关键细节说明
- exists/array_exists:这两个函数会遍历数组的所有元素,只要有一个元素满足条件就返回
true,完美匹配你"至少一个元素符合要求"的过滤逻辑。 - 正则表达式
^test_\\d+:^限定匹配字符串的开头test_匹配固定前缀\\d+匹配一个或多个数字(Scala中反斜杠需要转义,因此写两个)
- 为什么你的之前尝试不适用:
array_contains仅支持精确值匹配,无法处理模式匹配场景;data[0].id只能检查数组的第一个元素,无法覆盖所有元素的校验。
内容的提问来源于stack exchange,提问作者Rumen Panchev
相关产品推荐
相关产品推荐

