Presto:如何从 s3 读取在子文件夹中分区的整个存储桶?

Posted

技术标签:

【中文标题】Presto:如何从 s3 读取在子文件夹中分区的整个存储桶?【英文标题】:Presto: How to read from s3 an entire bucket that is partitioned in sub-folders? 【发布时间】:2020-05-29 16:52:13 【问题描述】:

我需要使用 s3 中的 presto 读取位于“bucket-a”中的整个数据集。但是,在存储桶内,数据按年份保存在子文件夹中。所以我有一个看起来像这样的桶:

bucket-a>2017>数据

Bucket-a>2018>更多数据

Bucket-a>2019>更多数据

以上所有数据都是同一张表,但在s3中以这种方式保存。请注意,bucket-a 本身没有数据,只是在每个文件夹内。

我要做的就是从存储桶中读取所有数据作为单个表添加一年作为列或分区。

我试过这样做,但没有奏效:

CREATE TABLE hive.default.mytable (
  col1 int,
  col2 varchar,
  year int
)
WITH (
  format = 'json',
  partitioned_by = ARRAY['year'],
  external_location = 's3://bucket-a/'--also tryed 's3://bucket-a/year/'

)

还有

CREATE TABLE hive.default.mytable (
  col1 int,
  col2 varchar,
  year int
)
WITH (
  format = 'json',
  bucketed_by = ARRAY['year'],
  bucket_count = 3,
  external_location = 's3://bucket-a/'--also tryed's3://bucket-a/year/'
)

以上所有方法均无效。

我见过有人使用 presto 将分区写入 s3,但我想做的是相反的:从 s3 数据中读取已经拆分为单个表的文件夹。

谢谢。

【问题讨论】:

【参考方案1】:

如果您的文件夹遵循 Hive 分区文件夹命名约定 (year=2019/),您可以将表声明为已分区并仅使用 system. sync_partition_metadata procedure in Presto。

现在,您的文件夹不遵循约定,因此您需要使用system.register_partition 程序将每个文件夹单独注册为一个分区(将在即将发布的 Presto 330 中提供)。 (register_partition 的替代方法是在 Hive CLI 中运行适当的 ADD PARTITION。)

【讨论】:

非常适合我。非常感谢。

以上是关于Presto:如何从 s3 读取在子文件夹中分区的整个存储桶?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 python 中使用 pyarrow 从 S3 读取分区镶木地板文件

Spark - 从 S3 读取分区数据 - 分区是如何发生的?

Presto 和 hive 分区发现

从 S3 存储桶中读取大量 CSV 文件

AWS Glue - GlueContext:从 S3 读取分区数据,将分区添加为 DynamicFrame 的列

如何从 pyspark rdd 或分区中确定原始 s3 输入文件名