You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 14:41:01