我刚刚开始使用Athena,意图从多个帐户查询CloudTrail管理事件。
我正在按照本指南配置第一个表:
https://cloudonaut.io/analyzing-cloudtrail-with-athena/
由于CloudTrail事件的文件夹结构(密钥前缀),它被划分为:
PARTITIONED BY (account string, region string, year string, month string, day, string)
然后我用CATS创建另一个表,将JSON转换为ORC,并按照本指南存储在另一个桶中:
https://aws.amazon.com/blogs/big-data/using-ctas-statements-with-amazon-athena-to-reduce-cost-and-improve-performance/
我对数据库知识的缺乏可能使我过于贪婪。我希望在设置桶分区时跳过区域。我想不出有什么理由希望每个帐户只查询一个特定区域的管理事件,如果每个帐户每天可以有三个文件,我不希望每个帐户每天查询30个文件。
这就是我要运行的:
CREATE TABLE cloudtrail_partitioned_bucketed
WITH (
partitioned_by = ARRAY['account','year','month','day'],
bucketed_by = ARRAY['eventname'],
bucket_count = 3,
format = 'orc',
external_location = 's3://bucket/athena/out/'
)
AS
SELECT
*
FROM cloudtrail_logs
我得到错误:
HIVE_COLUMN_ORDER_MISMATCH: Partition keys must be the last columns in the table and in the same order as the table properties
当然,如果我只是按顺序使用值,而不管哪个值(帐户,地区/年,月,日)。我知道分区键不是动态的,但是我可以直接删除分区键"region"为了半兽人的转换?我从事件本身有一个区域。
欢迎任何关于这个想法有多糟糕的反馈。我脑子里的概念是每天计划运行一次,将每个帐户中的CloudTrail事件转换为不同桶中的ORC,以便与雅典娜查询一起使用。CloudTrail事件将更快地归档,Athena用户运行的所有查询将针对较小的ORC文件运行。
考虑到帐户的数量,我希望在分区键中使用region时减少必要的分区数量。
嗯,我有点笨。休息一段时间后,我又回来试了一遍。这一次,我没有假设初始表创建键与文件夹路径有任何关系。
代替:
PARTITIONED BY (account string, region string, year string, month string, day, string)
我使用
:
PARTITIONED BY (account string, year string, month string, day, string)
,它似乎工作。
我仍然不知道我所做的是否合乎逻辑。如有任何意见,我们将不胜感激。
谢谢