如何在Azure Synapse管道中扁平化带1:M映射的嵌套数组JSON
在Azure Synapse Data Flow中按索引扁平化嵌套数组(1:M映射)
你的问题出在单独展开timestamps和values数组时产生了笛卡尔积,而实际需要这两个数组按索引一一对应(即第i个timestamp对应第i个value)。以下是具体实现步骤:
操作步骤
步骤1:展开基础层级
通过两次Unroll活动依次展开result和data数组,得到包含dimensions(单元素数组)、timestamps(数组)、values(数组)的行数据。步骤2:生成索引序列
添加Derived Column活动,创建名为indexes的新列,表达式为:range(0, size(timestamps))该表达式会生成从0到数组长度-1的整数数组,比如
timestamps长度为4时,indexes的值为[0,1,2,3]。步骤3:展开索引数组
添加Unroll活动,选择展开indexes列,此时每一行会被拆分为与数组长度相等的行数,每行对应一个索引值。步骤4:按索引提取对应值
再次添加Derived Column活动,替换原有列:- 替换
timestamps列,表达式:timestamps[indexes] - 替换
values列,表达式:values[indexes] - 若要将
dimensions从数组转为字符串,表达式:dimensions[0]
- 替换
步骤5:清理冗余列
使用Select活动,只保留dimensions、timestamps、values这三列,移除indexes、原数组列等冗余数据。
完成以上步骤后,输出结果就会和你期望的一致,每个timestamp对应同索引的value,不会产生笛卡尔积的冗余行。
内容的提问来源于stack exchange,提问作者sac
相关产品推荐
相关产品推荐

