亚马逊雅典娜分区表

Fru*_*rai 2 hive amazon-web-services presto amazon-athena

我正在尝试按年,月和日对Amazon Athena查询的数据进行分区。但是,当我尝试从分区数据查询时,无法获得任何记录。我按照此博客文章中的说明进行操作。

创建表查询:

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/'
Run Code Online (Sandbox Code Playgroud)

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

“查询成功。如果表具有分区,则需要加载这些分区才能查询数据。可以加载所有分区,也可以分别加载它们。如果使用加载所有分区(MSCK REPAIR TABLE)命令,则分区必须采用Hive可以理解的格式。了解详情。”

跑步

msck repair table mvc_test2;
Run Code Online (Sandbox Code Playgroud)

我得到结果:

“分区不在Metastore中:mvc_test2:2017/06/06/21 mvc_test2:2017/06/06/22”

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

日志以年/月/日/小时的子文件夹格式存储。例如:“ s3:// firehose-application-logs / process /年/月/日/小时”

如何正确分区数据?

Joh*_*ein 6

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

因此,您的数据的当前格式使您无法使用分区。您需要重命名目录或(最好)通过 HIVE 处理您的数据以将其存储为正确的格式。

另请参阅:使用 Amazon Athena 分析 S3 中的数据


小智 5

按日期添加每个分区。这样可以更快,为您节省更多的钱。仅加载您需要的分区,而不是所有分区。

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

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

show partitions mvc_test2
Run Code Online (Sandbox Code Playgroud)