2017-05-11 19 views
1

我遇到以下问题。我有大约30,000个JSON文件存储在特定存储桶中的S3中。这些文件非常小;每个只需要400-500Kb,但它们的数量并不是很小。“sqlContext.read.json”花费很长时间从S3中读取30,000个小型JSON文件(400 Kb)

我想根据所有这些文件创建DataFrame。我使用通配符如下读取JSON文件:

var df = sqlContext.read.json("s3n://path_to_bucket/*.json") 

我也试过,因为json(...)这种做法已经过时:

var df = sqlContext.read.format("json").load("s3n://path_to_bucket/*.json") 

的问题是,它需要很长的时间来创建df。我等了4个小时,Spark工作仍在继续。

是否有更有效的方法来收集所有这些JSON文件并基于它们创建一个DataFrame?

UPDATE:

,或者至少是它可以读取最后1000个文件,而不是读的所有文件?我发现,可以通过如下选项sqlContext.read.format("json").options,但我不知道如何只读取N个最新的文件。

回答

1

如果你能得到最后的1000修改文件名成一个简单的列表,你可以简单地调用:

sqlContext.read.format("json").json(filePathsList: _*) 

请注意,.option调用(S)通常用于配置模式选项。

不幸的是,我以前没有使用过S3,但我认为你可以使用相同的逻辑在回答这个问题得到最后修改的文件名: How do I find the last modified file in a directory in Java?

0

您正在载入13Gb的信息。你确定创建DF需要很长时间吗?也许它正在运行应用程序的其余部分,但用户界面显示。

只需加载并打印DF的第一行。

无论如何,集群的配置是什么?