重命名 Athena 分区的 S3 文件夹结构

Sil*_*ily 3 amazon-s3 amazon-athena

我可以访问结构类似于bucket_name/year/month/day/file.gz 的S3 存储桶,每天有数百个文件。我知道要定义此数据的分区 Athena 表,需要将其命名为 Bucket_name/year=year/month=month/day=day。缺少每天写一个shell脚本来拼写(所以,一系列

aws cp --recursive s3://old_bucket/YYYY/MM/DD/* s3://new_bucket/year=YYYY/month=MM/day=DD/
Run Code Online (Sandbox Code Playgroud)

对于数据集中的每个 YYYY/MM/DD 值)

有没有更简单的方法来解决这个问题?我知道ALTER TABLE ADD PARTITION,但似乎又需要我单独指定每个分区。

The*_*heo 5

您根本不需要重命名这些文件。虽然大多数示例确实使用Hive 风格的命名约定,但 Athena 并不需要它。

\n

向 Athena 表添加分区的方法有多种。在你的情况下,我要么使用分区投影,这将使新的数据分区立即可用。或者,您可以使用 手动添加分区ALTER TABLE \xe2\x80\xa6 ADD PARTITION

\n

要创建配置了分区投影的表,您可以将此作为起点:

\n
CREATE EXTERNAL TABLE my_table (\n  \xe2\x80\xa6\n)\nPARTITIONED BY (\n  `date` string\n)\nTBLPROPERTIES (\n  "projection.enabled" = "true",\n  "projection.date.type" = "date",\n  "projection.date.range" = "2020/01/01,NOW",\n  "projection.date.format" = "yyyy/MM/dd",\n  "storage.location.template" = "s3://bucket_name/${date}/"\n)\n
Run Code Online (Sandbox Code Playgroud)\n

然后您可以使用以下命令查询您的表

\n
SELECT *\nFROM my_table\nWHERE "date" = \'2020/10/24\'\n
Run Code Online (Sandbox Code Playgroud)\n

请注意,日期列/分区键是字符串而不是DATE. Athena 将获取该字符串并将其插入到 给定的 URI 中storage.location.template。分区投影非常聪明,例如,我鼓励您阅读文档以了解该\xe2\x80\xa6.range属性的用途。

\n

另请注意,这date是一个保留字,要在 DDL 中使用它,必须用反引号引用它,但在查询中需要用双引号引用它。PARTITIONED BY如果您想避免总是引用,您可以将其命名为其他名称,但如果您这样做,则需要更改部分和部分中的名称TBLPROPERTIES

\n

分区投影的替代方案是手动添加分区,这是一个相当新的功能。您可以使用 Glue Data Catalog API 来完成此操作,在我看来,这在编写代码时更可取,或者您也可以使用 DDL 来完成此操作,它更紧凑且更容易适应 Stack Overflow 答案。

\n

假设您有一个像上面那样分区的表date(但没有,TBLPROPERTIES因为这些是特定于分区投影的),您可以像这样添加分区:

\n
ALTER TABLE my_table ADD IF NOT EXISTS\nPARTITION (`date` = \'2020-10-22\') LOCATION \'s3://bucket_name/2020/10/22/\'\nPARTITION (`date` = \'2020-10-23\') LOCATION \'s3://bucket_name/2020/10/23/\'\nPARTITION (`date` = \'2020-10-24\') LOCATION \'s3://bucket_name/2020/10/24/\'\n
Run Code Online (Sandbox Code Playgroud)\n

然后您可以像这样查询您的表:

\n
SELECT *\nFROM my_table\nWHERE "date" = \'2020-10-24\'\n
Run Code Online (Sandbox Code Playgroud)\n

请注意,此处我添加的分区的分区键值与 S3 URI 中日期的表示方式并不完全对应(我以标准 ISO 方式使用破折号而不是斜杠来格式化日期)。手动添加分区时,分区键值和 S3 URI 之间根本不必有任何对应关系。

\n

有些人会告诉您,您必须使用 Athena 的 Hive 风格分区,然后您应该使用MSCK REPAIR TABLE. 情况并非如此,正如我希望上面所示的那样,使用该命令添加分区不是一个好主意,它适用于几个分区,但最终它会开始超时

\n