PySpark/SparkSQL:如何筛选JSON数组中指定属性对应的字段值?
解决Spark DataFrame中提取数组内特定条件字段的问题
针对你遇到的identifier数组中use='official'对应value提取需求(数组元素位置不固定、长度可变),可以用以下两种常用方法实现:
方法一:展开数组后过滤(直观易理解)
通过explode将数组拆分为多行,筛选出符合条件的条目后提取value,适合需要查看所有匹配项的场景:
SQL 写法
SELECT t.*, official_entry.value AS official_identifier FROM t LATERAL VIEW explode(t.identifier) exploded_entries AS official_entry WHERE official_entry.use = 'official'
PySpark DataFrame API 写法
from pyspark.sql.functions import explode, col # 展开数组并筛选,最后提取目标值 t.select("*", explode(col("identifier")).alias("official_entry")) \ .filter(col("official_entry.use") == "official") \ .select("*", col("official_entry.value").alias("official_identifier"))
方法二:使用高阶函数过滤(高效不改变行数)
利用Spark的高阶函数filter直接在数组内筛选符合条件的元素,再提取第一个匹配项的value,适合需要保留原数据行数的场景:
SQL 写法
SELECT *, -- 筛选出use=official的元素数组,取第一个元素的value element_at(filter(identifier, x -> x.use = 'official'), 1).value AS official_identifier FROM t
PySpark DataFrame API 写法
from pyspark.sql.functions import filter, element_at, col # 直接在数组内筛选并提取目标值 t.withColumn( "official_identifier", element_at(filter(col("identifier"), lambda x: x["use"] == "official"), 1)["value"] )
注:如果数组中存在多个
use='official'的条目,方法一会返回所有匹配行,方法二仅返回第一个匹配的value,可根据实际需求选择。
内容的提问来源于stack exchange,提问作者Michiel Meulendijk
相关产品推荐
相关产品推荐

