我的Azure Data Lake帐户中有很多json文件。它们被组织为:存档 - >文件夹1 - > JSON文件。
我想要做的是从每个json中提取一个特定的字段:timestamp然后将它放在一个csv文件中。
我的问题是:
我从这个脚本开始:
CREATE ASSEMBLY IF NOT EXISTS [Newtonsoft.Json] FROM "correct_path/Assemblies/JSON/Newtonsoft.Json.dll";
CREATE ASSEMBLY IF NOT EXISTS [Microsoft.Analytics.Samples.Formats] FROM "correct_path/Assemblies/JSON/Microsoft.Analytics.Samples.Formats.dll";
REFERENCE ASSEMBLY [Newtonsoft.Json];
REFERENCE ASSEMBLY [Microsoft.Analytics.Samples.Formats];
DECLARE @INPUT_FILE string = @"correct_path/Tracking_3e9.json";
//Extract the different properties from the Json file using a JsonExtractor
@json =
EXTRACT Partition string, Custom string
FROM @INPUT_FILE
USING new Microsoft.Analytics.Samples.Formats.Json.JsonExtractor();
OUTPUT @json
TO "correct_path/Output/simple.csv"
USING Outputters.Csv(quoting : false);
我收到错误:
E_STORE_USER_FILENOTFOUND:找不到文件或拒绝访问
但是我确实可以访问Azure Data Lake的数据资源管理器中的文件,那怎么可能呢?
Haven没有找到任何关于此的教程。
感谢您的帮助。
答案 0 :(得分:2)
1)不确定为什么在没有更多信息的情况下遇到该错误 - 您是否明确错过了输入文件或者是程序集?
2)您可以使用文件集从一组文件中提取数据。只需使用{}表示输入字符串中的通配符,然后将该字符保存在新列中。例如,您的输入字符串可以是@" correct_path / {day} / {hour} / {id} .json",然后您的提取语句变为:
EXTRACT
column1 string,
column2 string,
day int,
hour int,
id int
FROM @input
3)您必须在SELECT语句中读取整个JSON,但是您可以将其细化为仅在未来行集中所需的行。例如:
@refine=
SELECT timestamp FROM @json;
OUTPUT @refine
...
听起来您的某些JSON数据是嵌套的(如时间戳字段)。您可以在我们的GitHub(Using the JSON UDFs)和this blog中找到有关如何读取嵌套JSON数据的信息。
希望这会有所帮助,如果您有其他问题,请告诉我们!