【问题标题】:"sqlContext.read.json" takes very long time to read 30,000 small JSON files (400 Kb) from S3“sqlContext.read.json”从 S3 读取 30,000 个小 JSON 文件 (400 Kb) 需要很长时间
【发布时间】:2017-05-11 14:14:23
【问题描述】:

我遇到了以下问题。我在特定存储桶内的 S3 中存储了大约 30,000 个 JSON 文件。这些文件非常小;每个只需要 400-500 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?

更新:

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

【问题讨论】:

    标签: scala apache-spark amazon-s3


    【解决方案1】:

    如果您可以将最近修改的 1000 个文件名放入一个简单的列表中,您可以简单地调用:

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

    请注意,.option 调用通常用于配置架构选项。

    不幸的是,我之前没有使用过 S3,但我认为您可以在此问题的答案中使用相同的逻辑来获取最后修改的文件名: How do I find the last modified file in a directory in Java?

    【讨论】:

      【解决方案2】:

      您正在加载大约 13Gb 的信息。您确定创建 DF 需要很长时间吗?也许它正在运行应用程序的其余部分,但 UI 显示了这一点。

      尝试仅加载和打印 DF 的第一行。

      对了,集群的配置是什么?

      【讨论】:

        猜你喜欢
        • 2014-01-23
        • 1970-01-01
        • 1970-01-01
        • 2014-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-06
        • 1970-01-01
        相关资源
        最近更新 更多