json - 从 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..)将替换为实际标题名称(压力,速度......等)
解决方案
使用数据库 [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。
推荐阅读
- c# - 如何在windows服务中实现互斥锁
- python - 定义跳过 nan 值的 pandas 数据帧的开始
- regex - 为什么 @+ 和 @{^CAPTURE} 的长度不同?
- android - 如何识别安卓应用程序的编程语言?
- php - 获取特定数组格式的表结构
- angular - 使用 ionic 4 的 ionic 选项卡式项目中缺少 app.scss
- regex - 如何在 botium 中转义括号和单引号
- azure-devops - Azure DevOps YAML:将变量发布为工件
- android - 数据更改时如何从firebase实时数据库中检索特定数据
- android - 沉浸式全屏和首选项对话框下拉状态栏