Spark DataFrame嵌套JSON列展开失败,求助可行解决方案
问题:展开Spark DataFrame中的JSON格式列
原始数据
| u_group | t_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.link | u_group.value | t_group.link | t_group.value |
|---|---|---|---|
| https://hi.com/api/now/table/system/2696f18b376bca0 | 2696f18b376bca0 | https://hi.com/api/now/table/system/2696f18b376bca0 | 2696f18b376bca0 |
| https://hi.com/api/now/table/system/99b27bc1db761f4 | 99b27bc1db761f4 | https://hi.com/api/now/table/system/99b27bc1db761f4 | 99b27bc1db761f4 |
尝试的代码及报错
尝试以下代码时抛出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
相关产品推荐
相关产品推荐

