如何在Python中将数组结构体(Array Struct)的组件转换为列?
如何在Python中将数组结构体(Array Struct)的组件转换为列?
问题背景
我现在需要处理JSON数据源里的数组结构体列,想要把Tags列拆分,让每个Key成为单独的列,对应的Value填充到列中;如果某个条目没有对应的Tag,就填空值。有没有实现思路?感谢!
当前数据结构(JSON Lines格式):
{"Account ID": "101356", "AccountName": "Account1", "Tags": [{"Key": "AppGroupEmail", "Value": "testteam"}, {"Key": "SNOW", "Value": "TASK21002089571"}, {"Key": "ClientID", "Value": "220001"}]} {"Account ID": "101357", "AccountName": "Account2", "Tags": [{"Key": "ClientID", "Value": "220007"}, {"Key": "BuildTicket", "Value": "TM21001412480"}, {"Key": "AccountType", "Value": "Dev"}]}
预期结果:
| Account ID | AccountName | AppGroupEmail | SNOW | ClientID | BuildTicket | AccountType |
|---|---|---|---|---|---|---|
| 101356 | Account1 | testteam | TASK21002089571 | 220001 | ||
| 101357 | Account2 | 220007 | TM21001412480 | Dev |
解决方案
下面给你两种常用的实现方式,分别适配不同数据量场景:
方式一:用Pandas处理(小数据量友好)
Pandas操作直观,适合处理本地小文件,代码逻辑清晰易懂:
import pandas as pd # 读取JSON Lines格式的文件(每行一个独立JSON对象) df = pd.read_json("your_json_file.json", lines=True) # 展开Tags数组,把每个Key-Value对拆成单独一行 exploded_df = df.explode("Tags", ignore_index=True) # 把Tags里的字典结构拆成Key和Value两列 exploded_df[["Key", "Value"]] = pd.DataFrame(exploded_df["Tags"].tolist(), index=exploded_df.index) # 透视转换:将Key转为列名,Value对应填充,同时保留账号基础信息 result_df = exploded_df.pivot( index=["Account ID", "AccountName"], columns="Key", values="Value" ).reset_index() # 移除列名的层级标签,缺失值填充为空字符串 result_df.columns.name = None result_df = result_df.fillna("") # 查看最终结果 print(result_df)
运行后就能得到和预期完全一致的表格,缺失的字段会自动填充为空值。
方式二:用PySpark处理(大数据量场景)
如果你的数据量很大,用PySpark的分布式处理能力会更高效,适合大数据平台批量处理:
from pyspark.sql import SparkSession from pyspark.sql.functions import explode, col, pivot, first # 初始化Spark会话 spark = SparkSession.builder.appName("UnnestTags").getOrCreate() # 读取JSON Lines格式的数据 df = spark.read.json("your_json_file.json", multiLine=False) # 展开Tags数组,每个Key-Value对生成一行数据 exploded_df = df.select("Account ID", "AccountName", explode("Tags").alias("tag")) # 拆分tag字典为Key和Value两个独立列 split_df = exploded_df.select( "Account ID", "AccountName", col("tag.Key").alias("Key"), col("tag.Value").alias("Value") ) # 透视转换:将Key转为列,用first函数取对应Value,缺失值填充为空字符串 result_df = split_df.groupBy("Account ID", "AccountName")\ .pivot("Key")\ .agg(first("Value"))\ .fillna("") # 展示最终结果 result_df.show()
这个方法能轻松处理TB级别的数据,在分布式集群上运行效率极高。
备注:内容来源于stack exchange,提问作者user22672915
相关产品推荐
相关产品推荐

