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

时间:2018-11-26 09:09:42

标签: json azure u-sql azure-data-factory-2

从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

按原样输出不正确

key1,key2,key3,key4

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

值“ 301”与key2无关

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

key1,key2,key3,key4

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

稍后所有标题(key1,key2 ..)将被实际的标题名称(Pressure,Velocity ...等)替换

1 个答案:

答案 0 :(得分:0)

使用数据库[ADLSDB];

DECLARE EXTERNAL @INPUT_FILE字符串=“ /adlspath/keyValue.txt”; DECLARE EXTERNAL @PIVOT_FILE字符串=“ /adlspath/pivot.txt”;

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

@requestData = EXTRACT id int,时间戳字符串,键字符串,值int FROM @INPUT_FILE使用Extractors.Csv(); @data = SELECT ID AS ID,时间戳AS时间戳,密钥AS密钥,AS值FROM @requestData;

DECLARE EXTERNAL @ids字符串=“ key1,key2,key3,key4”; //“外部声明”

@result = SELECT * FROM(选择ID,时间戳,键,值FROM @data) AS D PIVOT(密钥IN(@ids AS标题)的SUM(值))AS P;

使用Outputters.Csv输出到@PIVOT_FILE的结果(quoting:false,outputHeader:false);

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

------已更新------------

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