Athena 根据 S3 中引入的分区动态查询更改

Posted

技术标签:

【中文标题】Athena 根据 S3 中引入的分区动态查询更改【英文标题】:Athena queries changes on the fly according to the partitions introduced in S3 【发布时间】:2021-03-05 05:56:02 【问题描述】:

我在 S3 中对我的 DATA_BUCKET 进行了分区,其结构为 S3/DATA_BUCKET/table_1/YYYY/MM/DD/files.parquet

现在我在 table_1 中有另外三个列,在 Athena 中显示为“partition_0”、“partition_1”和“partition_2”(分别代表年、月和日)。

到目前为止,我的应用程序一直在根据表中的“time_stamp”列进行与时间相关的查询: select * from table_1 where time_stamp like '2023-01-17%'

现在要利用分区的性能,相应的新查询是: select * from table_1 where partition_0 = '2023' and partition_1 = '01' and partition_2 = '17'

问题: 由于在我的应用程序中之前有很多关于 time_stamp 的查询,我不想更改它们,但仍以某种方式将这些查询转换为我的“partitions-type-queries”,就像上面一样。

在雅典娜内部有什么办法吗?

TIA

【问题讨论】:

老实说,我认为这个问题更像是“软件问题”,而不是 Athena 问题。我可以看到您的问题,我认为如果您所有的旧查询都是“从 t1 中选择 c1,c2,其中 time_stamp = #VAR”也许您可以将分区内容附加到所有旧查询中,将 #VAR 拆分为年、月和日? 【参考方案1】:

您可以使用新的“time_stamp”列从原始表创建视图。 此列根据日期部分计算 日期

CREATE OR REPLACE VIEW my_view AS
SELECT mytable.col1, 
    mytable.col2, 
    cast(date_add('day', trans_day - 1, date_add('month', trans_month - 1, date_add('year', trans_year - 1970, from_unixtime(0)))) as Date) as time_stamp
FROM my_db.my_table mytable

【讨论】:

以上是关于Athena 根据 S3 中引入的分区动态查询更改的主要内容,如果未能解决你的问题,请参考以下文章

在 AWS Athena 中查询第一个非空值的动态 JSON 字段

Redshift Spectrum 比 Athena 慢很多?

Redshift Spectrum 性能对比 Athena

我可以从存储在 S3 中的 sql 文件运行 Athena 查询吗

在不同账户的 Lambda 中从 AWS Athena 查询 S3 文件时访问被拒绝

Amazon athena 无法读取 S3 Access 日志文件,Athena 选择查询为每一列返回空结果集