sed*_*dhu 1 amazon-web-services presto amazon-athena
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
Run Code Online (Sandbox Code Playgroud)
PARTITIONED BY (
`parent` string,
`year` int,
`month` tinyint,
`date` tinyint)
Run Code Online (Sandbox Code Playgroud)
现在,我应该如何形成选择查询的 where 条件以获取 2019-06-01 到 2020-04-31 的 Parent = "9ab4fcca-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 ;
Run Code Online (Sandbox Code Playgroud)
但这是不正确的。请帮忙
按年、月、日分别分区会使查询表变得不必要的困难。如果您刚开始,我真的建议避免这种分区方案。如果您无法避免它,您仍然可以通过以不同方式创建表分区来使事情变得更容易。
\n\n大多数指南会告诉您创建类似的目录结构year=2020/month=4/date=1/file1,创建一个具有三个相应分区列的表,然后运行MSCK REPAIR TABLE加载分区。这可行,但远不是使用 Athena 的最佳方式。MSCK REPAIR TABLE性能很糟糕,而且这样的分区远非理想。
我建议创建的目录结构只是2020-03-01/file1,但如果你不能,你实际上可以拥有任何你想要的结构,2020/03/01/file1,year=2020/month=4/date=1/file1,或任何其他结构,其中每个日期都有一个不同的前缀,或多或少都可以很好地工作。
我还建议您创建仅包含一个分区列的表:(date或者dt如果day您想避免引用),键入为DATE,而不是字符串。
然后您要做的,不是直接运行,而是MSCK REPAIR TABLE使用ALTER TABLE \xe2\x80\xa6\xc2\xa0ADD PARTITIONGlue API 来添加分区。此命令允许您与分区列值分开指定位置:
ALTER TABLE my_table ADD\nPARTITION (day = '2020-04-01') LOCATION 's3://some-bucket/path/to/2020-04-01/'\nRun Code Online (Sandbox Code Playgroud)\n\n这里重要的是分区列值不必与位置有任何关系,这同样有效:
\n\nALTER TABLE my_table ADD\nPARTITION (day = '2020-04-01') LOCATION 's3://some-bucket/path/to/data-for-first-of-april/'\nRun Code Online (Sandbox Code Playgroud)\n\n对于您的具体情况,您可以:
\n\nPARTITIONED BY (`parent` string, `day` date)\nRun Code Online (Sandbox Code Playgroud)\n\n然后执行以下操作:
\n\nALTER TABLE your_table ADD\nPARTITION (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'\nPARTITION (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'\nPARTITION (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'\nPARTITION (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'\nRun Code Online (Sandbox Code Playgroud)\n
以下是如何使用来自分区的年、月和日值来选择日期范围
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'
Run Code Online (Sandbox Code Playgroud)
您可以根据需要添加额外的过滤语句)
| 归档时间: |
|
| 查看次数: |
5231 次 |
| 最近记录: |