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

时间:2018-02-10 21:40:49

标签: json azure utf-8 analytics u-sql

我遇到了Azure Data Lake Analytics挑战,我正在寻求帮助。

问题

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

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

问题

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

如果是这样,怎么样?

而且,如果答案使用U-SQL而不需要代码隐藏,那将是非常好的。我可以做到这一点,但我的团队的其他成员不能和我评估ADLA"开箱即用"能力现在。

非常感谢,

Ĵ

PS。其他详细信息

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

我需要使用UTF-8和JSON,因为我的输入数据包含分隔符,主要是由于人们输入文本字段,在线人员喜欢"为了给我们数据人员提供额外的事情,我们一起玩:)

以下是输入文件格式,删除了特殊字符,因为该文件是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

1 个答案:

答案 0 :(得分:2)

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

  1. 将输入格式从数组更改为一系列行描述的JSON文档。假设每行/文档小于4MB,您可以并行化提取。

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

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