首页 > 解决方案 > 从 JSON 转换时如何标准化 USQL 的输出以包含所有列的数据

问题描述

从 JSON 转换时如何标准化 USQL 的输出以包含所有列的数据

我们需要标准化 USQL 的输出。USQL 读取 JSON(源文件)数据并将其转换为 csv 格式。问题在于,由于 JSON 中缺少数据,我们在 csv 中的每一行所拥有的列数并不相同。有时 USQL 的结果集在 csv 中有一行包含“N”列,另一行包含“N+1”列(单元格)。我们希望标准化输出,在 csv 中为所有行提供相同数量的列。我们如何实现这一目标?我们无法控制源文件数据,我们需要在处理时进行标准化。有没有人遇到过类似的挑战并找到了解决方案?谢谢你的帮助!

输入细节:

{"map": {"key1": 100,    "key2": 101,    "key3": 102},  "id": 2,  "time": 1540300241230}
{"map": {"key1": 200,    "key2": 201,    "key3": 202    "key4": 203},  "id": 2,  "time": 1540320246930}
{"map": {"key1": 300,    "key3": 301,    "key4": 303},  "id": 2,  "time": 1540350246930}

一旦根据一些计算将上述 JSON 转换为 CSV

按原样输出不正确

键 1、键 2、键 3、键 4

100, 101, 102
200, 201, 202, 203
300, 301, 303

值“301”与 key2 无关

预期输出 - # 是缺失列值的默认值

键 1、键 2、键 3、键 4

100, 101, 102,  #
200, 201, 202, 203
300, #, 301, 303

稍后所有标题(key1,key2..)将替换为实际标题名称(压力,速度......等)

标签: jsonazureu-sqlazure-data-factory-2

解决方案


使用数据库 [ADLSDB];

声明外部@INPUT_FILE string = "/adlspath/keyValue.txt"; 声明外部@PIVOT_FILE string = "/adlspath/pivot.txt";

/* 关于请求的元数据开始 - 文件request.json的内容 */

@requestData = EXTRACT id int、时间戳字符串、键字符串、值 int FROM @INPUT_FILE USING Extractors.Csv(); @data = SELECT id AS id, timestamp AS timestamp, key AS key, value AS value FROM @requestData;

声明外部@ids string = "key1,key2,key3,key4"; //“外部声明”

@result = SELECT * FROM (SELECT id, timestamp, key, value FROM @data ) AS D PIVOT(SUM(value) FOR key IN(@ids AS heading)) AS P;

使用 Outputters.Csv(quoting:false, outputHeader:false) 将 @result 输出到 @PIVOT_FILE;

通过使用上面的代码,我能够接近解决方案,但是我坚持将多个值传递给 IN 子句。@ids 列表,我将在 USQL 的编译时获得,但将其作为逗号分隔的标量变量传递不会产生结果。如果我只传递一个值(假设 key1),则 IN 条件匹配并输出 Key1 的行。任何人都知道如何将多个值传递给 USQL PIVOT 函数中的 IN 子句。

- - - 更新 - - - - - -

我们能够通过使用动态 USQL 来解决这个问题。一个 USQL 将以所需格式将 USQL 语句写入输出。然后另一个数据工厂活动将读取动态生成的 USQL。


推荐阅读