如何从像'年=年/月=月/日=日/'对于给定的日期范围



Athena表的分区与s3文件夹路径相同

parent=9ab4fcca-65d8-11ea-bc55-0242ac130003/year=2020/month=4/date=17
parent=9ab4fcca-65d8-11ea-bc55-0242ac130003/year=2020/month=4/date=9
parent=0fc966a0-bba7-4c0b-a648-cff7f0332059/year=2020/month=4/date=16
parent=9ab4fcca-65d8-11ea-bc55-0242ac130003/year=2020/month=4/date=14
PARTITIONED BY ( 
`parent` string, 
`year` int, 
`month` tinyint, 
`date` tinyint)

现在,我应该如何形成选择查询的where条件,以便从2019-06-01到2020-04-31获取parent="9ab4fca-65d8-11ea-bc55-0242ac130003"的数据?

SELECT *  
FROM table 
WHERE parent = '9ab4fcca-65d8-11ea-bc55-0242ac130003' AND year >= 2019 AND year <= 2020 AND month >= 04 AND month <= 06 AND date >= 01 AND date <= 31 ;

但这是不对的。请帮助

分别对年、月和日进行分区会给查询表带来不必要的困难。如果你刚开始,我真的建议你避免这种分区方案。如果你不能避免它,你仍然可以通过不同的方式创建表分区来让事情变得更容易。

大多数指南都会告诉您创建像year=2020/month=4/date=1/file1这样的目录结构,创建一个包含三个相应分区列的表,然后运行MSCK REPAIR TABLE来加载分区。这是有效的,但这远不是使用雅典娜的最佳方式。MSCK REPAIR TABLE具有糟糕的性能,而像这样的分区远非理想。

我建议创建仅为2020-03-01/file1的目录结构,但如果不能,您实际上可以使用任何您想要的结构,2020/03/01/file1year=2020/month=4/date=1/file1,或任何其他每个日期有一个不同前缀的结构,这些结构或多或少都能正常工作。

我还建议您创建只有一个分区列的表:date(或者dtday,如果您想避免引用的话(,类型为DATE,而不是字符串。

然后,不用运行MSCK REPAIR TABLE,而是直接使用ALTER TABLE … ADD PARTITION或Glue API来添加分区。此命令允许您指定与分区列值分开的位置:

ALTER TABLE my_table ADD
PARTITION (day = '2020-04-01') LOCATION 's3://some-bucket/path/to/2020-04-01/'

这里重要的是分区列的值不必与位置有任何关系,这同样有效:

ALTER TABLE my_table ADD
PARTITION (day = '2020-04-01') LOCATION 's3://some-bucket/path/to/data-for-first-of-april/'

对于您的具体情况,您可以:

PARTITIONED BY (`parent` string, `day` date)

然后做:

ALTER TABLE your_table ADD
PARTITION (parent = '9ab4fcca-65d8-11ea-bc55-0242ac130003', day = '2020-04-17') LOCATION 's3://your-bucket/parent=9ab4fcca-65d8-11ea-bc55-0242ac130003/year=2020/month=4/date=17'
PARTITION (parent = '9ab4fcca-65d8-11ea-bc55-0242ac130003', day = '2020-04-09') LOCATION 's3://your-bucket/parent=9ab4fcca-65d8-11ea-bc55-0242ac130003/year=2020/month=4/date=9'
PARTITION (parent = '0fc966a0-bba7-4c0b-a648-cff7f0332059', day = '2020-04-16') LOCATION 's3://your-bucket/parent=0fc966a0-bba7-4c0b-a648-cff7f0332059/year=2020/month=4/date=16'
PARTITION (parent = '9ab4fcca-65d8-11ea-bc55-0242ac130003', day = '2020-04-14') LOCATION 's3://your-bucket/parent=9ab4fcca-65d8-11ea-bc55-0242ac130003/year=2020/month=4/date=14'

以下是如何使用来自分区的年、月和日值来选择日期范围

SELECT col1, col2
FROM my_table 
WHERE CAST(date_parse(concat(CAST(year AS VARCHAR(4)),'-',
CAST(month AS VARCHAR(2)),'-',
CAST(day AS VARCHAR(2))
), '%Y-%m-%d') as DATE) 
BETWEEN DATE '2019-06-01' AND DATE '2020-04-31'

您可以根据需要添加额外的筛选语句(

相关内容

  • 没有找到相关文章

最新更新