如何使用PySpark将JSON字符串拆分为多列
如何使用PySpark将JSON字符串拆分为多列
看起来你现在有个PySpark DataFrame,里面一列全是API返回的JSON字符串,想要把这些嵌套的JSON结构拆成单独的列对吧?我来一步步教你怎么做~
首先先明确你当前的DataFrame状态:一列名为_1的字符串类型列,每一行都是完整的JSON字符串。接下来我们分三步完成拆分:
1. 定义JSON数据的Schema(推荐方式)
PySpark解析JSON时需要明确的Schema(结构定义),这样不仅效率更高,还能避免数据类型推断出错。假设你的JSON结构类似这样(根据实际API返回调整):
{ "abilities": [{"name": "overgrow", "url": "https://example.com/ability/1"}], "name": "bulbasaur", "id": 1 }
那对应的PySpark Schema可以这么定义:
from pyspark.sql.types import StructType, StructField, StringType, IntegerType, ArrayType # 先定义嵌套的abilities元素的Schema ability_schema = StructType([ StructField("name", StringType(), nullable=True), StructField("url", StringType(), nullable=True) ]) # 再定义整体JSON的Schema json_schema = StructType([ StructField("abilities", ArrayType(ability_schema), nullable=True), StructField("name", StringType(), nullable=True), StructField("id", IntegerType(), nullable=True) ])
如果不确定JSON的具体结构,也可以先让PySpark自动推断Schema(适合小数据量测试):
# 取第一行的JSON字符串作为样本 sample_json = df.select("_1").first()[0] # 基于样本推断Schema inferred_schema = spark.read.json(spark.sparkContext.parallelize([sample_json])).schema
2. 将JSON字符串解析为结构化的Struct列
使用from_json函数,把_1列的字符串解析成Struct类型的列:
from pyspark.sql.functions import from_json, col # 添加一个名为parsed_json的Struct列,包含所有JSON字段 df_parsed = df.withColumn("parsed_json", from_json(col("_1"), json_schema))
这时候你的DataFrame会新增一列parsed_json,展开后能看到所有JSON的字段和对应值。
3. 将Struct列拆分为独立的多列
最后一步就是把Struct里的每个字段提取成单独的列:
- 如果不需要保留原有的
_1列,可以直接展开所有字段:
df_final = df_parsed.select("parsed_json.*")
- 如果要保留原JSON字符串列:
df_final = df_parsed.select(col("_1"), "parsed_json.*")
完成后你就能得到每个JSON字段对应的独立列了!比如abilities、name、id这些列,完全符合你的需求~
备注:内容来源于stack exchange,提问作者Maurilio Cardoso
相关产品推荐
相关产品推荐

