首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自动向WHERE子句添加分区条件

自动向WHERE子句添加分区条件
EN

Stack Overflow用户
提问于 2021-10-23 13:25:56
回答 1查看 49关注 0票数 0

我有一个按天和小时分区的列表。它存储在S3上的拼接文件中,供雅典娜查询。下面是创建表的代码:

代码语言:javascript
复制
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上的布局是这样的:

代码语言:javascript
复制
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

因此,下面这样的查询会很快,因为它只扫描一个多小时的拼图文件,因为分区列被用来对其进行过滤:

代码语言:javascript
复制
-- fast, easy to write
SELECT * FROM foo WHERE day = '2021-10-10' AND hour = '00'

但是,该表还包括完整的datetime dt。通常,我们希望为不符合天/小时边界和/或位于不同时区的范围编写查询。

例如,这将扫描所有的拼图文件,并且速度非常慢:

代码语言:javascript
复制
-- slow, easy to write
SELECT * FROM foo WHERE dt > '2021-10-09 23:05:00' AND dt < '2021-10-11 01:00:00'

可以通过手动计算最小包含时间段的dayhour来改进它:

代码语言:javascript
复制
-- 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 (...))

雅典娜有没有可能做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-25 08:40:11

我曾多次希望这个功能,但不幸的是雅典娜不支持它。必须同时包含dt列的谓词以及dayhour分区键。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69688592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档