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

Spark DataFrame嵌套JSON列展开失败,求助可行解决方案

问题:展开Spark DataFrame中的JSON格式列

原始数据

u_groupt_group
{"link": "https://hi.com/api/now/table/system/2696f18b376bca0", "value": "2696f18b376bca0"}{"link": "https://hi.com/api/now/table/system/2696f18b376bca0", "value": "2696f18b376bca0"}
{"link": "https://hi.com/api/now/table/system/99b27bc1db761f4", "value": "99b27bc1db761f4"}{"link": "https://hi.com/api/now/table/system/99b27bc1db761f4", "value": "99b27bc1db761f4"}

期望结果

u_group.linku_group.valuet_group.linkt_group.value
https://hi.com/api/now/table/system/2696f18b376bca02696f18b376bca0https://hi.com/api/now/table/system/2696f18b376bca02696f18b376bca0
https://hi.com/api/now/table/system/99b27bc1db761f499b27bc1db761f4https://hi.com/api/now/table/system/99b27bc1db761f499b27bc1db761f4

尝试的代码及报错

尝试以下代码时抛出TypeError: 'Column' object is not callable:

import ast
from pandas.io.json import json_normalize

df12 = spark.sql("""select u_group,t_group from tbl""")

def only_dict(d):
    '''
    Convert json string representation of dictionary to a python dict
    '''
    return ast.literal_eval(d)

def list_of_dicts(ld):
    '''
    Create a mapping of the tuples formed after 
    converting json strings of list to a python list   
    '''
    return dict([(list(d.values())[1], list(d.values())[0]) for d in ast.literal_eval(ld)])

A = json_normalize(df12['u_group'].apply(only_dict).tolist()).add_prefix('link.')
B = json_normalize(df['u_group'].apply(list_of_dicts).tolist()).add_prefix('value.') 

解决方案

报错原因

你混淆了Spark DataFrame与Pandas DataFrame的API:Spark的Column对象没有apply方法,df12['u_group']返回的是Spark Column,调用.apply()会直接报错;另外代码中还引用了未定义的df变量,也是潜在问题。

方法1:用get_json_object直接提取字段

适合简单JSON结构的快速提取:

from pyspark.sql.functions import get_json_object

# 提取并命名目标字段
df_result = df12.select(
    get_json_object("u_group", "$.link").alias("u_group.link"),
    get_json_object("u_group", "$.value").alias("u_group.value"),
    get_json_object("t_group", "$.link").alias("t_group.link"),
    get_json_object("t_group", "$.value").alias("t_group.value")
)

df_result.show()

方法2:用from_json结合Schema解析

适合复杂JSON结构或需要指定字段类型的场景:

from pyspark.sql.functions import from_json
from pyspark.sql.types import StructType, StructField, StringType

# 定义JSON字段的Schema
group_schema = StructType([
    StructField("link", StringType(), nullable=True),
    StructField("value", StringType(), nullable=True)
])

# 解析JSON列
df_parsed = df12.select(
    from_json("u_group", group_schema).alias("u_group"),
    from_json("t_group", group_schema).alias("t_group")
)

# 展开嵌套结构并命名列
df_result = df_parsed.select(
    "u_group.link", "u_group.value",
    "t_group.link", "t_group.value"
).toDF("u_group.link", "u_group.value", "t_group.link", "t_group.value")

df_result.show()

内容的提问来源于stack exchange,提问作者Roho

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 05:10:33