您根本不需要重命名文件。虽然大多数使用Hive-style naming convention Athena 的示例确实不需要它。
There are many ways to add partitions to an Athena table。在您的情况下,我会选择partition projection,这将使新的数据分区立即可用。或者,您可以使用 ALTER TABLE … ADD PARTITION 手动添加分区。
要创建一个配置了分区投影的表,您可以以此为起点:
CREATE EXTERNAL TABLE my_table (
…
)
PARTITIONED BY (
`date` string
)
TBLPROPERTIES (
"projection.enabled" = "true",
"projection.date.type" = "date",
"projection.date.range" = "2020/01/01,NOW",
"projection.date.format" = "yyyy/MM/dd",
"storage.location.template" = "s3://bucket_name/${date}/"
)
然后您可以使用
查询您的表
SELECT *
FROM my_table
WHERE "date" = '2020/10/24'
请注意,日期列/分区键是一个字符串,而不是 DATE。 Athena 将获取字符串并将其插入到storage.location.template 给出的 URI 中。分区投影非常聪明,例如,我鼓励您read the docs 了解….range 属性的作用。
还要注意date 是一个保留字,要在DDL 中使用它,您必须用反引号引用它,但在查询中它需要用双引号引起来。如果您想避免总是引用,您可以将其命名为其他名称,但如果您这样做,则需要更改 PARTITIONED BY 部分和 TBLPROPERTIES 部分中的名称。
分区投影的替代方法是手动添加分区,这是一个相当新的功能。您可以使用 Glue 数据目录 API 执行此操作,在我看来,这在编写代码时更可取,或者您可以使用 DDL 执行此操作,它更紧凑且更容易适应 Stack Overflow 答案。
假设您有一个像上面那样由date 分区的表(但没有TBLPROPERTIES,因为它们是特定于分区投影的),您可以像这样添加分区:
ALTER TABLE my_table ADD IF NOT EXISTS
PARTITION (`date` = '2020-10-22') LOCATION 's3://bucket_name/2020/10/22/'
PARTITION (`date` = '2020-10-23') LOCATION 's3://bucket_name/2020/10/23/'
PARTITION (`date` = '2020-10-24') LOCATION 's3://bucket_name/2020/10/24/'
然后您可以像这样查询您的表:
SELECT *
FROM my_table
WHERE "date" = '2020-10-24'
请注意,我添加的分区中的分区键值与 S3 URI 中日期的表示方式不完全对应(我以标准 ISO 方式使用破折号而不是斜线来格式化日期)。手动添加分区时,分区键的值和 S3 URI 之间根本不需要任何对应关系。
有些人会告诉你,你必须对 Athena 使用 Hive 风格的分区,然后你应该使用MSCK REPAIR TABLE 添加分区。情况并非如此,我希望我已经在上面展示过,使用该命令添加分区不是一个好主意,它适用于几个分区,但eventually it will start timing out。