如何 select 来自 aws athena table 的数据,这些数据在给定日期范围内像 'year=yyyy/month=MM/date=dd/' 一样分区?
How to select data from aws athena table which is partitioned like 'year=yyyy/month=MM/date=dd/' for a given date range?
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)
现在我应该如何形成 select 查询的 where 条件以获取 parent = "9ab4fcca-65d8-11ea-bc55-0242ac130003" 从 2019-06-01 到 2020-04-31 的数据?
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 ;
但这不正确。请帮忙
这里是如何使用来自分区的年月日值来select日期范围
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'
您可以根据需要添加额外的过滤语句)
分别按年、月和日进行分区会使查询 table 变得不必要地困难。如果你刚开始,我真的建议避免这种分区方案。如果您无法避免它,您仍然可以通过以不同方式创建 table 分区来简化事情。
大多数指南会告诉您创建 year=2020/month=4/date=1/file1
之类的目录结构,创建具有三个相应分区列的 table,然后 运行 MSCK REPAIR TABLE
加载分区。这可行,但远非使用 Athena 的最佳方式。 MSCK REPAIR TABLE
性能很糟糕,这样的分区远非理想。
我建议创建只是 2020-03-01/file1
的目录结构,但如果不能,您实际上可以拥有任何您想要的结构,2020/03/01/file1
、year=2020/month=4/date=1/file1
或任何其他结构每个日期有一个不同前缀的结构或多或少同样有效。
我还建议您创建仅包含一个分区列的 table:date
(或者 dt
或 day
,如果您想避免引用),键入 DATE
,不是字符串。
然后您所做的,而不是 运行ning 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'
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)
现在我应该如何形成 select 查询的 where 条件以获取 parent = "9ab4fcca-65d8-11ea-bc55-0242ac130003" 从 2019-06-01 到 2020-04-31 的数据?
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 ;
但这不正确。请帮忙
这里是如何使用来自分区的年月日值来select日期范围
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'
您可以根据需要添加额外的过滤语句)
分别按年、月和日进行分区会使查询 table 变得不必要地困难。如果你刚开始,我真的建议避免这种分区方案。如果您无法避免它,您仍然可以通过以不同方式创建 table 分区来简化事情。
大多数指南会告诉您创建 year=2020/month=4/date=1/file1
之类的目录结构,创建具有三个相应分区列的 table,然后 运行 MSCK REPAIR TABLE
加载分区。这可行,但远非使用 Athena 的最佳方式。 MSCK REPAIR TABLE
性能很糟糕,这样的分区远非理想。
我建议创建只是 2020-03-01/file1
的目录结构,但如果不能,您实际上可以拥有任何您想要的结构,2020/03/01/file1
、year=2020/month=4/date=1/file1
或任何其他结构每个日期有一个不同前缀的结构或多或少同样有效。
我还建议您创建仅包含一个分区列的 table:date
(或者 dt
或 day
,如果您想避免引用),键入 DATE
,不是字符串。
然后您所做的,而不是 运行ning 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'