首页 文章

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

提问于
浏览
0

我被困在Azure Data Lake Analytics挑战中,正在寻求帮助 .

Issue

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

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

Question

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

如果是这样,怎么样?

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

非常感谢,

Ĵ

ps. Additional Details

由于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 回答

  • 2

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

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

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

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

相关问题