我有来自SQL的数据,一个有两列Id和Tags的表,都是字符串类型,Tags代表一个json数组:
身份证 | 标签 |
---|---|
1 | [{'标签':'值','标签1':'值'},{'标签':'值','标签1':'值'}] |
2 | [{'标签':'值','标签1':'值'}] |
我想动态设置属性tag和tag1的名称,而不是tag和tag1,可以将其更改为property和property1。我有一个 json 文件来设置新旧属性名称:
{
"tag" : "property",
"tag1" : "property1"
}
我可以轻松更改属性名称,只需用新名称替换旧名称并使用缓存接收器,如下所示:
replace(replace(Tags,"tag",CachedSink#outputs()[1].tag),"tag1",CachedSink#outputs()[1].tag1)
身份证 | 标签 |
---|---|
1 | [{'属性':'值','属性1':'值'},{'属性':'值','属性1':'值'}] |
2 | [{'属性':'值','属性1':'值'}] |
之后,我需要将 Tags 列解析为实际的 json 数组,这可以通过使用 Parse 活动并指定输出列类型来完成。
Parse 活动允许您指定复杂类型,但显然无法引用任何参数或缓存的接收器。
有没有办法实现这个目标?
除了数据类型之外,Parse 转换表达式不支持任何参数或数据流函数。
要获取涉及动态列名称的 JSON,您可以尝试以下解决方法。
这涉及首先生成 JSON 文件,然后将该 JSON 复制到您的目标。使用 Blob 或 ADLS 存储临时 JSON 文件。
更换钥匙后,请按照以下转换操作。
首先添加派生列转换并添加任何关键字列,如下所示。
然后进行聚合转换,在分组部分中,使用上面的列
key
。在聚合部分,使用 collect(Tags)
。
这将给出如下结果。
现在,连接此数组中的所有项目,并在派生列中使用以下表达式创建一个对象数组的 JSON 字符串。
replace(replace(concat('[',replace(replace(toString(Tags),'[',''),']',''),']'),'"{','{'),'}"','}')
现在,添加接收器并使用分隔文本数据集作为接收器。使用分隔文本数据集生成
JSON
文件。为此,请在数据集中给出以下配置。
将其添加为接收器,我们需要一个 JSON 文件。因此,转到接收器设置 -> 设置输出到单个文件并给出目标 JSON 文件名。
在映射中,仅给出必需的列。
你有两个水槽。您正在第二个接收器中使用缓存接收器。因此,应该首先执行缓存接收器,然后执行此接收器。您可以将缓存接收器的写入顺序设置为
1
,将此接收器的写入顺序设置为 2
。
从管道执行数据流后,将生成所需的 JSON 文件,如下所示。
数据流活动之后,使用复制活动将此 JSON 复制到您的目标位置。