如何将大型 JSON 数组文件加载到 Azure Data Lake Analytics (ADLA)

How do I load Large JSON Array files into Azure Data Lake Analytics (ADLA)

我遇到了 Azure 数据湖分析挑战,正在寻求帮助。

问题

我需要从 Azure Data Lake 加载一个文件,其中包含大约 150m 行 JSON 数据,存储为 JSON 对象数组。该文件的大小约为 110G。当我尝试加载该文件时,ADLA 似乎挂起,几个小时的进度为“0%”,algebra.xml 或其他文件没有状态更新。

通过在线文档搜索,似乎 ADLA 仅限于 "a single vertex" 从存储中提取文件。这看起来很奇怪,但作业图确实始终表示输入节点有 1 个顶点。为了以防万一,我尝试了一个 32 AU 的工作,但什么也没做。我还让一个 1 AU 的工作 运行 工作了大约 3.5 小时,但也没有做任何事情(即从未取得进展)。

问题

您知道如何让 ADLA 读取 UTF-8 JSON 具有数百万成员对象的大型数组文件吗?

如果可以,怎么做?

而且,如果答案使用 U-SQL 而无需代码隐藏,那就太好了。我可以做到,但我团队的其他人不能,我现在正在评估 ADLA "out-of-the-box" 功能。

非常感谢,

J

ps。其他详细信息

据我所知,由于 JsonExtractor,我需要使用 JSON 格式的数组(如果不是这种情况,plmk)。

我需要使用 UTF-8 和 JSON,因为我的输入数据包含定界符,这主要是由于在线人员 "love" 用来为我们的数据人员提供额外的人工输入文本字段要做的事情:)

以下是输入文件格式,由于文件是UTF-8格式,去掉了特殊字符。

[{'key':'car'},{'key':'bar'},....,{'key':'yar'}]

通过加载,我的意思是将 EXTRACT 语句与提供 JSONExtractor() 的开源程序集一起使用。请注意,JsonExtractor 目前需要一个 JSON 对象数组(至少我上次查看源代码时是这样)。

以下是提取方法的代码片段。

#...The below assumes the assembly is loaded to a database named [SOMEDB]

USE DATABASE [SOMEDB];

REFERENCE ASSEMBLY [SOMEDB].[Newtonsoft.Json]; 
REFERENCE ASSEMBLY [SOMEDB].[Microsoft.Analytics.Samples.Formats];  

USING Microsoft.Analytics.Samples.Formats.Json; 

@input_dataset = EXTRACT
                   [ThereAreManyMoreColumnsThanThis]  decimal?
                  ,[HundredsOfColumns]                string
                  ,[YouGetTheIdea]                    DateTime
  FROM '/a/file/path/where/file/resides.json' 
  USING new JsonExtractor()

#...Other stuff

鉴于您的 JSON 文档的大小,示例提取器不是为您的用例设计的。以下是一些建议:

  1. 将输入格式从数组更改为按行分隔的 JSON 文档序列。假设每个 row/document 小于 4MB,您可以并行提取。

  2. 将您的 JSON 数组拆分为多个文件中的较小数组。

  3. 编写您自己的自定义提取器。假设您可以识别数组中的每个顶部元素,您甚至可以实现一个并行提取器(尽管这将是一个高级主题,因为您需要专门处理文件的第一部分和最后一部分,并确保您可以处理元素末尾与范围边界不对齐的情况,类似于内置文本提取器所做的)。在这种情况下,请确保使用 JSON 解析器的 reader 接口,而不是将文档全部加载到内存中。