【问题标题】:How to efficiently find the latest partition from a S3 dataset using Spark如何使用 Spark 从 S3 数据集中高效地查找最新分区
【发布时间】:2019-10-13 02:05:12
【问题描述】:

我的数据集几乎每天都会添加数据,并且需要每天在更大的 ETL 的一部分中进行处理。 当我直接选择分区时,查询真的很快:

SELECT * FROM JSON.`s3://datalake/partitoned_table/?partition=2019-05-20`

然而,问题在于事件类型在某些星期日不生成数据,导致该特定日期不存在分区。因此,我无法使用前面的语句来运行我的日常工作。

另一次尝试让我尝试让 spark 找到该数据集的最新分区,以确保更大的查询不会失败:

SELECT * FROM JSON.`s3://datalake/partitoned_table/`
WHERE partition = (SELECT MAX(partition) FROM JSON.`s3://datalake/partitoned_table/`)

这每次都有效,但速度慢得令人难以置信。

我找到了很多关于如何构建和维护分区的文章和参考资料,但没有关于如何正确阅读它们的信息。

知道如何正确完成这项工作吗?

【问题讨论】:

标签: sql apache-spark apache-spark-sql hiveql


【解决方案1】:

没有 Hive 时的解决方法-

FileSystem.get(URI.create("s3://datalake/partitoned_table"), conf).listStatus(new Path("s3://datalake/partitoned_table/"))

以上代码将为您提供文件分区列表example - List(s3://datalake/partitoned_table/partition=2019-05-20, s3://datalake/partitoned_table/partition=2019-05-21....)

这非常有效,因为它只从 s3 位置获取元数据。

只需获取最新的文件分区并将其用于您的 SQL。

【讨论】:

    【解决方案2】:

    (SELECT MAX(partition) FROM JSON.s3://datalake/partitoned_table/)
    此查询将作为 Spark 中的子查询执行。
    慢的原因
    1. 子查询需要在实际查询开始执行前完成。
    2. 上述查询将列出所有 S3 文件以检索分区信息。如果文件夹中有大量文件,此过程将需要很长时间。列出时间与文件数量成正比。

    我们可以使用分区方案在s3://datalake/partitoned_table/ 之上创建一个表,假设表的名称是tbl
    你可以执行一个
    ALTER TABLE tbl RECOVER PARTITIONS
    它将分区信息存储在 Metastore 中。这也涉及到列表,但它是一次性操作,并且 spark 会产生多个线程来执行列表以使其更快。

    然后我们可以开火

    SELECT * FROM tbl WHERE partition = (SELECT MAX(partition) FROM tbl`)
    

    它将仅从元存储中获取分区信息,而不必列出我认为是一项昂贵的操作的对象存储。
    这种方法产生的成本是恢复分区的成本。
    之后所有查询都会更快(当新分区的数据来了,我们需要重新恢复分区)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-02
      • 1970-01-01
      • 1970-01-01
      • 2018-03-23
      • 1970-01-01
      • 2020-03-11
      • 1970-01-01
      相关资源
      最近更新 更多