我在athena上用这段代码创建了一个具有自动分区的表。
CREATE EXTERNAL TABLE IF NOT EXISTS matchdata.stattable (
`matchResult` string,
...
) PARTITIONED BY (
year int ,
month int,
day int
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES (
'serialization.format' = '1'
) LOCATION 's3://******/data/year=2019/month=8/day=2/'
TBLPROPERTIES ('has_encrypted_data'='false');
我运行了msck repair table stattable,但文件系统中缺少表,查询结果是返回零条记录。matchdata.stattable得到相同的结果。
另一个没有分区的表,查询工作正常。但是随着服务的继续和数据集的增长,我必须使用分区。
示例数据路径是data/2019/8/2/1sxfhauehfesltps.\u bjdk.gz。我怎样才能解决这个问题?
2条答案
按热度按时间5ktev3wc1#
正如你所发现的(但是对于有同样问题的人来说,有更多的背景)
MSCK REPAIR TABLE …
只了解Hive式分区,例如。/data/year=2019/month=08/day=10/file.json
. 命令真正做的是扫描s3上与表的前缀相对应的前缀LOCATION
指令并查找类似的路径组件。这只是一个限制
MSCK REPAIR TABLE …
,您可以手动添加具有以下其他路径样式的分区:另请参见https://docs.aws.amazon.com/athena/latest/ug/alter-table-add-partition.html
我甚至认为你应该避免使用
MSCK REPAIR TABLE …
总而言之。它很慢,而且只会随着分区的增多而变慢。跑起来效率更高ALTER TABLE … ADD PARTITION …
当你在s3上添加新的数据时,因为你知道你刚刚添加了什么以及它在哪里,所以告诉雅典娜扫描整个前缀是没有必要的。直接使用glueapi的速度更快,但不幸的是,这需要更多的代码。fykwrbwg2#
我通过重命名s3文件的前缀来解决这个问题。
实际上,不能直接在s3中重命名或移动文件。通过mv命令,您应该创建另一个键并删除现有的键。
通过在控制台上运行此代码,可以使配置单元能够理解分区的位置。