如何将特殊键值对格式的旧JSON文件转换为PySpark DataFrame
实现代码
首先导入依赖并初始化Spark会话:
from pyspark.sql import SparkSession from pyspark.sql.functions import map_from_entries, col, regexp_extract, from_json # 初始化Spark会话 spark = SparkSession.builder.appName("KVJsonToDF").getOrCreate()
情况1:JSON格式标准(外层数组有对应键名)
如果你的JSON结构如下(修正了语法问题,数组键为records):
{ "records": [ {"key":"id","value":"1"}, {"key":"First Name","value":"Saurabh"}, {"key":"Email","value":"saurab4562@gmail.com"} ] }
使用以下代码转换:
# 读取JSON文件 raw_df = spark.read.json("你的JSON文件路径") # 将key-value数组转为Map结构 df_with_map = raw_df.withColumn("kv_map", map_from_entries(col("records"))) # 展开Map为独立列 result_df = df_with_map.select("kv_map.*") # 可选:将id字段转为整数类型 result_df = result_df.withColumn("id", col("id").cast("int")) # 查看结果 result_df.show()
情况2:JSON格式不标准(外层对象直接包数组无键名)
如果你的JSON就是提问示例里的无键名不规范格式,先按文本读取再预处理:
# 按文本格式读取文件 raw_df = spark.read.text("你的JSON文件路径") # 提取数组部分并解析为结构化数据 parsed_df = raw_df.select( from_json( regexp_extract(col("value"), "\\{(.*)\\}", 1), "array<struct<key:string, value:string>>" ).alias("records") ) # 后续转换逻辑和标准格式一致 df_with_map = parsed_df.withColumn("kv_map", map_from_entries(col("records"))) result_df = df_with_map.select("kv_map.*") # 查看结果 result_df.show()
输出结果
执行后得到的DataFrame和你预期的格式一致:
+---+----------+--------------------+ | id|First Name| Email| +---+----------+--------------------+ | 1| Saurabh|saurab4562gmail.com | +---+----------+--------------------+
内容的提问来源于stack exchange,提问作者Techno_Eagle
相关产品推荐
相关产品推荐

