我有一个在Azure Data Lake环境中运行的U-SQL应用程序。它应该处理一个充满JSON数据的文件,除非在现实生活中超过两行。
[
{"reports" : {"direction": "FWD", "drive": "STOPS", "frob_variable": 0}},
{"reports" : {"direction": "FWD", "drive": "CRANKS", "frob_variable": -3}}
]
在Data Lake的工作中,我有以下几行:
@json =
EXTRACT direction string, drive string, frob_variable int FROM @"/input/file.json"
USING new Microsoft.Analytics.Samples.Formats.Json.JsonExtractor("reports");
当我将@json
变量的内容转储到文本文件时,我得到空值:零长度字符串和零值整数。我确实得到了正确的输出行数,所以它必须迭代我的所有输入。
对JsonExtractor
的源代码进行了一些探讨,向我展示了我指定的JsonPath值("报告")似乎正在返回"报告"嵌入式字典的关键。如果我尝试JsonPath值"报告。*"我确实得到了嵌入的值(例如{ "FWD", "STOPS", 0 }
),但我真的希望密钥与它们一起使用,以便SELECT direction, drive, frob_variable
返回一些有用的东西。
长话短说,我正在寻找一种从内部字典中提取键和值的方法。因此,EXTRACT
的所需输出将是一个行集,其列为" direction"," drive"和" frob_variable"其值如源数据中所示。看起来应该有一个JsonPath解决方案或U-SQL中的简单解决方法。
答案 0 :(得分:2)
@extract =
EXTRACT
reports String
FROM @"/input/file.json"
USING new Microsoft.Analytics.Samples.Formats.Json.JsonExtractor();
@relation =
SELECT
Microsoft.Analytics.Samples.Formats.Json.JsonFunctions.JsonTuple(reports)
AS report
FROM @extract;
@fields =
SELECT
report["direction"] AS direction,
report["drive"] AS drive,
Int32.Parse(report["frob_variable"]) AS frob
FROM @relation;