PySpark中如何将DataFrame的字符串数据读取为JSON并生成新DataFrame
PySpark解析字符串列中的JSON数据方案
方案1:已知JSON结构(性能最优)
提前手动定义JSON对应的Schema,避免全表扫描推断结构,适合生产环境大流量场景。
- 导入依赖并定义Schema:
from pyspark.sql.functions import from_json from pyspark.sql.types import StructType, StructField, StringType, MapType # 根据实际JSON结构调整Schema,以下为示例匹配你提供的嵌套request结构 json_schema = StructType([ StructField("request", MapType(StringType(), StringType()), nullable=True) # 如需更细粒度的嵌套结构,可继续在request对应位置嵌套StructType ])
- 解析字符串并生成新DataFrame:
# df_raw 为你原有存储JSON字符串的DataFrame df_parsed = df_raw.withColumn("json_data", from_json("col1", json_schema)) # 展开解析后的JSON字段为顶层列 df_final = df_parsed.select("json_data.*")
方案2:未知JSON结构(自动推断)
不需要提前知道JSON结构,Spark自动扫描数据推断Schema,适合小数据量、调试场景。
# 将字符串列转为RDD后直接读取JSON json_rdd = df_raw.rdd.map(lambda row: row.col1) df_final = spark.read.json(json_rdd)
注意:
- 自动推断Schema会触发全表扫描,数据量大时可加
samplingRatio参数设置采样比例,例如spark.read.json(json_rdd, samplingRatio=0.1)- 你提供的样例数据开头有特殊字符,可先清洗后再解析,例如:
from pyspark.sql.functions import regexp_replace # 去掉JSON字符串开头所有非{的字符 df_raw = df_raw.withColumn("col1", regexp_replace("col1", "^[^\\{]*", ""))
内容的提问来源于stack exchange,提问作者For
相关产品推荐
相关产品推荐

