在 Azure 数据工厂解析活动中设置动态复杂类型

问题描述 投票:0回答:1

我有来自SQL的数据,一个有两列Id和Tags的表,都是字符串类型,Tags代表一个json数组:

身份证 标签
1 [{'标签':'值','标签1':'值'},{'标签':'值','标签1':'值'}]
2 [{'标签':'值','标签1':'值'}]

我想动态设置属性tagtag1的名称,而不是tag和tag1,可以将其更改为propertyproperty1。我有一个 json 文件来设置新旧属性名称:

{
  "tag" : "property",
  "tag1" : "property1"
}

enter image description here

我可以轻松更改属性名称,只需用新名称替换旧名称并使用缓存接收器,如下所示:

replace(replace(Tags,"tag",CachedSink#outputs()[1].tag),"tag1",CachedSink#outputs()[1].tag1)
身份证 标签
1 [{'属性':'值','属性1':'值'},{'属性':'值','属性1':'值'}]
2 [{'属性':'值','属性1':'值'}]

之后,我需要将 Tags 列解析为实际的 json 数组,这可以通过使用 Parse 活动并指定输出列类型来完成。

enter image description here

Parse 活动允许您指定复杂类型,但显然无法引用任何参数或缓存的接收器。

有没有办法实现这个目标?

azure parsing dynamic azure-data-factory
1个回答
0
投票

除了数据类型之外,Parse 转换表达式不支持任何参数或数据流函数。

要获取涉及动态列名称的 JSON,您可以尝试以下解决方法。

这涉及首先生成 JSON 文件,然后将该 JSON 复制到您的目标。使用 Blob 或 ADLS 存储临时 JSON 文件。

更换钥匙后,请按照以下转换操作。

首先添加派生列转换并添加任何关键字列,如下所示。

enter image description here

然后进行聚合转换,在分组部分中,使用上面的列

key
。在聚合部分,使用
collect(Tags)

enter image description here

这将给出如下结果。

enter image description here

现在,连接此数组中的所有项目,并在派生列中使用以下表达式创建一个对象数组的 JSON 字符串。

replace(replace(concat('[',replace(replace(toString(Tags),'[',''),']',''),']'),'"{','{'),'}"','}')

enter image description here

现在,添加接收器并使用分隔文本数据集作为接收器。使用分隔文本数据集生成

JSON
文件。为此,请在数据集中给出以下配置。

enter image description here

将其添加为接收器,我们需要一个 JSON 文件。因此,转到接收器设置 -> 设置输出到单个文件并给出目标 JSON 文件名。

enter image description here

在映射中,仅给出必需的列。

enter image description here

你有两个水槽。您正在第二个接收器中使用缓存接收器。因此,应该首先执行缓存接收器,然后执行此接收器。您可以将缓存接收器的写入顺序设置为

1
,将此接收器的写入顺序设置为
2

enter image description here

从管道执行数据流后,将生成所需的 JSON 文件,如下所示。

enter image description here

数据流活动之后,使用复制活动将此 JSON 复制到您的目标位置。

© www.soinside.com 2019 - 2024. All rights reserved.