WHERE子句自动添加分区条件
Automatically add partition conditions to WHERE clause
我有一个按天和小时分区的柱状 table。它以 parquet 文件的形式存储在 S3 上,供 Athena 查询。这是创建 TABLE:
CREATE EXTERNAL TABLE foo (
-- other columns here
dt timestamp,
day string,
hour string
)
PARTITIONED BY (day string, hour string)
STORED AS parquet
LOCATION 's3://foo/foo'
S3 上的布局是这样的:
s3://foo/foo/day=2021-10-10/hh=00/*.parquet
s3://foo/foo/day=2021-10-10/hh=01/*.parquet
...etc
s3://foo/foo/day=2021-10-10/hh=23/*.parquet
所以像下面这样的查询会很快,因为它只扫描一个多小时的镶木地板文件,因为分区列用于过滤它:
-- fast, easy to write
SELECT * FROM foo WHERE day = '2021-10-10' AND hour = '00'
但是,table 还包括完整的日期时间 dt
。通常我们想为不符合 day/hour 边界的范围编写查询,and/or 处于不同的时区。
例如,这将扫描所有镶木地板文件并且非常慢:
-- slow, easy to write
SELECT * FROM foo WHERE dt > '2021-10-09 23:05:00' AND dt < '2021-10-11 01:00:00'
可以通过手动计算最小包围时间段的day
和hour
来改善:
-- fast, painful to write
SELECT * FROM foo
WHERE
((day, hh) IN (('2021-10-09', '23'), ('2021-10-11', '00')) OR day = '2021-10-10')
AND
dt > '2021-10-09 23:05:00' AND dt < '2021-10-11 01:00:00'
理想情况下,数据库可以透明地添加这个额外条件,以避免必须手动添加 ((day,hh) IN (...))
。
Athena 是否有可能做到这一点?
我曾多次希望有这个功能,可惜 Athena 不支持。您必须包括 dt
列的谓词以及 day
和 hour
分区键。
我有一个按天和小时分区的柱状 table。它以 parquet 文件的形式存储在 S3 上,供 Athena 查询。这是创建 TABLE:
CREATE EXTERNAL TABLE foo (
-- other columns here
dt timestamp,
day string,
hour string
)
PARTITIONED BY (day string, hour string)
STORED AS parquet
LOCATION 's3://foo/foo'
S3 上的布局是这样的:
s3://foo/foo/day=2021-10-10/hh=00/*.parquet
s3://foo/foo/day=2021-10-10/hh=01/*.parquet
...etc
s3://foo/foo/day=2021-10-10/hh=23/*.parquet
所以像下面这样的查询会很快,因为它只扫描一个多小时的镶木地板文件,因为分区列用于过滤它:
-- fast, easy to write
SELECT * FROM foo WHERE day = '2021-10-10' AND hour = '00'
但是,table 还包括完整的日期时间 dt
。通常我们想为不符合 day/hour 边界的范围编写查询,and/or 处于不同的时区。
例如,这将扫描所有镶木地板文件并且非常慢:
-- slow, easy to write
SELECT * FROM foo WHERE dt > '2021-10-09 23:05:00' AND dt < '2021-10-11 01:00:00'
可以通过手动计算最小包围时间段的day
和hour
来改善:
-- fast, painful to write
SELECT * FROM foo
WHERE
((day, hh) IN (('2021-10-09', '23'), ('2021-10-11', '00')) OR day = '2021-10-10')
AND
dt > '2021-10-09 23:05:00' AND dt < '2021-10-11 01:00:00'
理想情况下,数据库可以透明地添加这个额外条件,以避免必须手动添加 ((day,hh) IN (...))
。
Athena 是否有可能做到这一点?
我曾多次希望有这个功能,可惜 Athena 不支持。您必须包括 dt
列的谓词以及 day
和 hour
分区键。