使用AWS Glue ETL将多层嵌套数组拆分为独立行
在AWS Glue中展开多层嵌套JSON数组的解决方案
我懂你现在的需求——要把嵌套了两层数组的JSON拆成每行对应一个event,同时保留顶层的country、duration,还有state层级的stateId对吧?确实只用一次unnest()搞不定,得分步处理两层嵌套,我给你分享具体的实现步骤和代码:
处理思路
你的数据是顶层数组states → 每个state里嵌套events数组,所以我们需要分两步展开:
- 先展开外层的
states数组,让每个state和顶层数据(country、duration)对应成一行 - 再展开每个state里的
events数组,让每个event和上层的所有数据对应成一行
完整代码示例
1. 初始化Glue上下文
from awsglue.context import GlueContext from awsglue.dynamicframe import DynamicFrame from pyspark.context import SparkContext # 初始化Spark和Glue上下文 sc = SparkContext.getOrCreate() glueContext = GlueContext(sc)
2. 读取原始JSON数据
这里以读取S3上的JSON文件为例,你可以根据实际数据源调整:
# 读取原始嵌套JSON source_dyf = glueContext.create_dynamic_frame.from_options( connection_type="s3", connection_options={"paths": ["s3://your-input-bucket/path/to/json-files/"]}, format="json" )
3. 分步展开嵌套数组
# 第一步:展开states数组,得到每个state对应的顶层数据 unnested_states = source_dyf.unnest( path="states", transform_ctx="unnest_states_step" ) # 第二步:展开每个state下的events数组,得到最终的每行一个event的结构 final_dyf = unnested_states.unnest( path="events", transform_ctx="unnest_events_step" )
4. (可选)展开parameters结构体
如果需要把parameters里的键值对也拆成单独列,可以再加一次unnest():
# 展开parameters嵌套结构体到单独字段 final_with_params_dyf = final_dyf.unnest( path="parameters", transform_ctx="unnest_parameters_step" )
5. 验证结果并写入
# 转换成Spark DataFrame查看数据结构和内容 final_df = final_dyf.toDF() final_df.printSchema() final_df.show(truncate=False) # 写入到目标存储(比如S3 Parquet格式) glueContext.write_dynamic_frame.from_options( frame=final_dyf, connection_type="s3", connection_options={"path": "s3://your-output-bucket/processed-data/"}, format="parquet", format_options={"compression": "snappy"} )
关键说明
unnest()方法会自动保留上层所有字段,不用担心丢失country、duration或者stateId这些信息- 如果嵌套数组里存在null值,可以在
unnest()里添加drop_null_fields=False参数来保留包含null的行 - 如果你用的是Glue Studio可视化编辑器,也可以通过添加**"Unnest"**转换组件,分两次配置路径来实现同样的效果
内容的提问来源于stack exchange,提问作者Eric Keen
相关产品推荐
相关产品推荐

