如何在PySpark DataFrame中提取字典数组指定Key的Value
解决方法
针对你的需求,不建议用正则处理结构化数据(容易因字段格式变化失效),直接利用PySpark对数组、结构体的原生支持来提取更可靠,以下是两种可行方案:
方案一:DataFrame API 方式
from pyspark.sql.functions import explode, col # 将数组中的每个结构体拆分为单独行 df_exploded = df.withColumn("struct_item", explode(col("_2"))) # 筛选key为Colour的条目,提取对应的value result_df = df_exploded.filter(col("struct_item.key") == "Colour") \ .select(col("struct_item.value").alias("colour_value")) result_df.show()
方案二:SQL 方式
先将DataFrame注册为临时视图,再用SQL语句处理:
# 注册临时视图 df.createOrReplaceTempView("data_table") # 执行SQL查询 result = spark.sql(""" SELECT struct_item.value AS colour_value FROM data_table LATERAL VIEW explode(_2) AS struct_item WHERE struct_item.key = 'Colour' """) result.show()
为什么你的正则方法失效?
- 你在SQL中写的
regexp_extract('_2', ...)是对字符串'_2'做匹配,不是对_2列的数据操作,应该去掉引号直接写_2; _2列是数组结构体类型,不是字符串类型,直接用正则处理会读取其字符串化后的格式,一旦字段顺序、空格变化就会匹配失败,完全不如结构化操作可靠。
内容的提问来源于stack exchange,提问作者Jim Macaulay
相关产品推荐
相关产品推荐

