我正在尝试按年,每月和每天查询的亚马逊雅典娜查询数据。但是,当我尝试从分区数据查询时,我无法获得任何记录。我遵循此博客文章中找到的说明。
创建表查询:
CREATE external TABLE mvc_test2 (
ROLE struct<Scope: string, Id: string>,
ACCOUNT struct<ClientId: string, Id: string, Name: string>,
USER struct<Id: string, Name: string>,
IsAuthenticated INT,
Device struct<IpAddress: string>,
Duration double,
Id string,
ResultMessage string,
Application struct<Version: string, Build: string, Name: string>,
Timestamp string,
ResultCode INT
)
Partitioned by(year string, month string, day string)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION 's3://firehose-titlesdesk-logs/Mvc/'
该表是成功创建的,结果消息说:
"查询成功。如果您的桌子有分区,则需要加载这些 分区以查询数据。您可以加载全部 分区或单独加载它们。如果您全部使用负载 分区(MSCK维修表(命令,分区必须以格式 由蜂巢理解。了解更多。"
运行
msck repair table mvc_test2;
我得到结果:
"分区不在 Metastore:MVC_TEST2:2017/06/06/21 MVC_TEST2:2017/06/06/22"
此时,当我尝试查询表时,我没有得到任何结果。
日志按年/月/天/小时以子文件夹格式存储。例如:'s3://firehose-application-logs/process/year/limer/day/hour'
如何正确分区数据?
看来您的目录格式为 2017/06/06/22
。这与具有year=2017/month=06/day=06/hour=22
的命名转换的蜂巢分区不兼容。
因此,数据的当前格式排除了您使用分区的能力。您需要重命名目录或(最好(通过Hive处理数据以以正确的格式存储数据。
另请参见:使用Amazon Athena在S3中分析数据
按日期添加每个分区。这种方式更快,可以为您节省更多的钱。仅加载您需要的分区,而不是所有分区。
ALTER TABLE mvc_test2
ADD PARTITION (year='2017',month='06',day='06')
location 's3://firehose-titlesdesk-logs/Mvc/'
您可以根据需要更改年度,月份和/或一天来加载更多分区,只需确保它们有效即可。然后,您可以检查以确保通过运行此查询加载分区:
show partitions mvc_test2
aws现在支持雅典娜分区预测,该预测将自动化分区管理并自动添加新数据,因为添加了新数据
https://docs.aws.amazon.com/athena/latest/ug/cloudtrail-logs.html#create-cloudtrail-table-table-partition-partition-partition-partition-procoction