从Azure Table Storage迁移数据至Cosmos DB SQL API:将扁平化嵌套对象转换为JSON嵌套结构的最优方案
如何将Azure Table的扁平化嵌套列转换为Cosmos DB的嵌套JSON结构
你遇到的这个问题其实挺常见——Azure Table存储会自动扁平化嵌套对象,而Cosmos DB更适配原生的嵌套JSON结构。好消息是,不用非得写复杂的自定义代码,Azure Data Factory(ADF)其实就能实现这个映射,可能你之前没留意到它的派生列转换功能。下面给你几个可行的方案:
方案1:用Azure Data Factory实现无代码嵌套转换
ADF的数据流可以轻松把扁平化的Address_*列重新组合成嵌套对象,步骤如下:
- 配置Azure Table数据源:先把你的Azure Table作为ADF的数据源,确保能读取到所有扁平化列(
Id、Name、Address_AddressLine1等)。 - 添加派生列活动:在数据流里插入「派生列」转换,针对
Address字段用表达式构造嵌套结构。你可以直接写JSON格式的表达式:
或者用ADF内置的{ "AddressLine1": Address_AddressLine1, "AddressLine2": Address_AddressLine2, "City": Address_City, "Postcode": Address_Postcode }createStruct函数更规范地生成结构:createStruct( 'AddressLine1', Address_AddressLine1, 'AddressLine2', Address_AddressLine2, 'City', Address_City, 'Postcode', Address_Postcode ) - 清理多余列:添加「选择」转换,把原来的
Address_*列排除,只保留Id、Name和新生成的Address列。 - 输出到Cosmos DB:把处理后的数据流输出到你的Cosmos DB SQL API容器,选择JSON格式写入,就能得到你想要的嵌套文档了。
方案2:用Azure Function做自定义转换(灵活场景)
如果ADF的配置对你来说有点繁琐,或者需要处理空值、特殊格式这类复杂逻辑,写个简单的Azure Function是个不错的选择:
- 读取Table数据:用Azure Storage SDK读取Table中的实体,拿到所有扁平化属性。
- 手动组装嵌套对象:以C#为例,把
Address_*属性提取出来组装成Address对象,再和Id、Name组合成完整的Customer:var customer = new Customer { Id = Guid.Parse(tableEntity["Id"].ToString()), Name = tableEntity["Name"].ToString(), Address = new Address { AddressLine1 = tableEntity["Address_AddressLine1"].ToString(), AddressLine2 = tableEntity["Address_AddressLine2"].ToString(), City = tableEntity["Address_City"].ToString(), Postcode = tableEntity["Address_Postcode"].ToString() } }; - 写入Cosmos DB:用Cosmos DB SDK把构造好的对象直接写入容器,SDK会自动序列化成嵌套JSON。
方案3:PowerShell/CLI脚本(小数据量场景)
如果你的数据量不大,用脚本一次性处理更高效:
- 用
Get-AzTableRow读取Azure Table的所有实体。 - 遍历每个实体,构造嵌套的JSON对象。
- 用
New-CosmosDbDocument把对象写入Cosmos DB。
总结
如果是大规模数据迁移,ADF的派生列转换是最简便的无代码方案;如果数据量小或者需要灵活逻辑,Azure Function或脚本会更合适。之前你可能没注意到ADF可以构造嵌套对象,这个功能刚好能解决你的扁平化转嵌套需求。
内容的提问来源于stack exchange,提问作者lahsrah
相关产品推荐
相关产品推荐

