从 JSON 转换时,如何标准化 USQL 的输出以包含所有列的数据
How to standardize the output of USQL to have data for all the columns when converted from JSON
如何标准化 USQL 的输出,以便在从 JSON
转换时包含所有列的数据
我们有一个标准化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
不正确的原样输出
key1,key2,key3,key4
100, 101, 102
200, 201, 202, 203
300, 301, 303
值“301”与键 2 没有关联
预期输出 - # 是缺少列值的默认值
key1,key2,key3,key4
100, 101, 102, #
200, 201, 202, 203
300, #, 301, 303
稍后所有标题(key1、key2..)将替换为实际的header名称(压力、速度...等)
使用数据库 [ADLSDB];
声明外部@INPUT_FILE string = "/adlspath/keyValue.txt";
声明外部 @PIVOT_FILE string = "/adlspath/pivot.txt";
/* 关于请求的元数据开始 - 文件内容 request.json */
@requestData = EXTRACT id int, timestamp string, key string, value 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"; //"external declaration"
@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 语句以所需格式写入输出。然后另一个数据工厂 activity 将读取动态生成的 USQL。
如何标准化 USQL 的输出,以便在从 JSON
转换时包含所有列的数据我们有一个标准化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
不正确的原样输出
key1,key2,key3,key4
100, 101, 102
200, 201, 202, 203
300, 301, 303
值“301”与键 2 没有关联
预期输出 - # 是缺少列值的默认值
key1,key2,key3,key4
100, 101, 102, #
200, 201, 202, 203
300, #, 301, 303
稍后所有标题(key1、key2..)将替换为实际的header名称(压力、速度...等)
使用数据库 [ADLSDB];
声明外部@INPUT_FILE string = "/adlspath/keyValue.txt"; 声明外部 @PIVOT_FILE string = "/adlspath/pivot.txt";
/* 关于请求的元数据开始 - 文件内容 request.json */
@requestData = EXTRACT id int, timestamp string, key string, value 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"; //"external declaration"
@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 语句以所需格式写入输出。然后另一个数据工厂 activity 将读取动态生成的 USQL。