我是Azure Data Factory的新手。我已经能够使用管道从REST API源生成一组JSON文件。每个文件由一个顶级JSON对象组成,该对象具有最多100个子对象的数组。输出将保存到Azure Blob存储容器中。
我现在想在将其写入Azure SQL之前使用映射数据流来修改JSON,但是我在语法上苦苦挣扎。我已将源配置为指向包含JSON文件的目录。 Source Projection选项卡显示正确的架构。我可以预览数据,并在每个文件中看到一行,并且可以展开子对象以查看完整结构。
但是,当我添加“派生列”操作时,“表达式生成器”中的“输入模式”为空白。我可以使用byName和byPosition函数引用源代码中的顶级元素,但是我不知道如何引用子元素。
我能够在网上找到的示例使用SQL表或CSV文件作为源。我找不到任何使用分层数据作为派生列的源的示例。
我错过了什么吗?是否支持这种情况?
答案 0 :(得分:0)
我找到了实现自己想要的方法。这可能不是最好的方法,但是可以。
似乎很难处理具有多个层次结构的JSON作为复制数据活动的源。您可以选择一级重复数据来映射到表结构(“映射”选项卡上的“集合引用”属性)。
在我的场景中,我映射到表的数据中还有其他重复数据。我更新了映射,以将子JSON数据写入SQL表中的文本字段。为此,我需要对管道使用Azure Data Factory JSON编辑器。您可以通过管道可视化编辑器右上角的“代码”链接访问此代码。
我为复制活动的“映射”数组的右括号后添加了以下行: “ mapComplexValuesToString”:是
活动定义中映射数组的完整路径是typeProperties-转换器-映射。添加新元素后,请确保逗号正确。
使用这种方法,我在SQL表中的集合引用中的每个数组项都有一行。数组项中的标量子元素被映射到表列,而子JSON元素被写入同一表中的数据列。
要提取子JSON中所需的值,我创建了一个使用CROSS APPLY OPENJSON语法的SQL视图。这使我可以像对待相关表一样对待数据字段中的JSON。您可以指定JSON所在的结构。如果JSON中嵌套了数据,则可以对每个级别应用相同的方法。
仅最新版本的SQL Server支持OPENJSON命令。我正在使用Azure SQL,因此对我有用。