如何在Azure Synapse中对同结构多Parquet文件进行动态透视
动态模板Parquet文件透视处理方案
步骤1:获取动态模板元数据列表
- 使用
Get Metadata活动,数据源指向根路径Container/,选择Child items字段,获取所有子目录(即各模板名称)。 - 若存在非模板目录,用
Filter活动筛选出符合模板命名规则的目录(比如前缀匹配、排除固定杂项目录)。
步骤2:Foreach循环遍历处理每个模板
- 将Foreach的
Items设为@activity('Get Metadata').output.childItems,根据资源情况开启并行处理(比如设置并行数为5)。 - 循环内核心流程:
- 参数化数据集:创建Parquet数据集,把
Template、Year、Month设为参数。在Foreach中,用@item().name作为Template参数值;若需遍历该模板下的所有年月,可嵌套Get Metadata获取子目录,再用内层Foreach处理每个年月。 - 数据流透视操作:
- 数据源选用参数化的Parquet数据集,开启
Recursively读取子目录,确保加载当前模板下所有年月的Parquet文件。 - 添加
Pivot转换:- 透视键选择
AttName,确保字段为字符串类型。 - 聚合列选择需要透视的数值字段(如
AttValue),根据业务需求选First(单值场景)或Sum(多值聚合场景)。 - 开启
Allow schema drift,自动适配不同模板的AttName差异。
- 透视键选择
- 参数化目标存储路径,比如
Container/Processed/Template@{item().name}/Year@{year}/Month@{month},保持与源一致的分区结构。
- 数据源选用参数化的Parquet数据集,开启
- 参数化数据集:创建Parquet数据集,把
步骤3:新模板自动触发(可选)
- 若需实时处理新生成的模板,用Event Grid触发Pipeline,监听Blob存储的目录创建事件,将新模板名称作为参数传入,避免全量遍历。
常见问题修复
- 同一数据流失败:大多是不同模板的
AttNameschema差异导致,需在源转换开启Allow schema drift,并设置Infer drifted column types为true。 - Foreach参数传递错误:检查
@item().name是否正确指向模板目录名,嵌套年月遍历时确保内层循环的参数引用正确。 - Parquet读取异常:确认数据集的
Compression type与源文件一致,开启递归读取子目录。
内容的提问来源于stack exchange,提问作者Crane
相关产品推荐
相关产品推荐

