亚马逊雅典娜的分区表

时间:2017-06-07 16:17:10

标签: amazon-web-services hive presto amazon-athena

我试图按年,月,日划分亚马逊雅典娜查询的数据。但是,当我尝试从分区数据查询时,我无法获取任何记录。我按照blog帖子中的说明进行操作。

创建表格查询:

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/'

表已成功创建,结果消息显示:

  

&#34;查询成功。如果您的表有分区,则需要加载这些分区   分区能够查询数据。你可以加载所有   分区或单独加载它们。如果你使用全部加载   分区(MSCK REPAIR TABLE)命令,分区必须采用格式   Hive理解。了解更多。&#34;

运行

msck repair table mvc_test2;

我得到了结果:

  

&#34;分区不在   Metastore:mvc_test2:2017/06/06/21 mvc_test2:2017/06/06/22&#34;

此时,当我尝试查询表时,我没有得到任何结果。

日志按年/月/日/小时以子文件夹格式存储。 例如:&#39; s3:// firehose-application-logs / process / year / month / day / hour&#39;

如何正确分区数据?

3 个答案:

答案 0 :(得分:4)

按日期添加每个分区。它的速度更快,为您节省更多资金。仅加载您需要的分区,而不是所有分区。

ALTER TABLE mvc_test2 
ADD PARTITION (year='2017',month='06',day='06')
location 's3://firehose-titlesdesk-logs/Mvc/'

您可以根据需要更改年,月和/或日来加载更多分区,只需确保它们有效。然后,您可以通过运行此查询来检查以确保加载分区:

show partitions mvc_test2

答案 1 :(得分:3)

您的目录格式似乎是2017/06/06/22。这与命名转化为year=2017/month=06/day=06/hour=22的HIVE分区不兼容。

因此,您当前的数据格式会妨碍您使用分区。您需要重命名目录或(最好)通过HIVE处理您的数据,以便以正确的格式存储它。

另请参阅:Analyzing Data in S3 using Amazon Athena

答案 2 :(得分:0)

AWS 现在支持 Athena Partition Projections,它会自动进行分区管理并在添加新数据时自动添加新分区

https://docs.aws.amazon.com/athena/latest/ug/cloudtrail-logs.html#create-cloudtrail-table-partition-projection