我在 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 可统计,但文件系统上缺少表,查询结果是返回零记录。 matchdata.stattable 得到相同的结果。
另一个没有分区的表,查询工作正常。但随着服务的继续和数据集的增长,我必须进行分区。
示例数据路径为 data/2019/8/2/1SxFHaUeHfesLtPs._BjDk.gz。我该如何解决这个问题?
正如您所发现的(但为有相同问题的人提供了更多背景信息)MSCK REPAIR TABLE …
只理解 Hive 风格的分区,例如/data/year=2019/month=08/day=10/file.json
。该命令的真正作用是扫描 S3 上与表的对应的前缀LOCATION
指令并查找类似的路径组件。
这只是一个限制MSCK REPAIR TABLE …
,您可以手动添加具有其他路径样式的分区,如下所示:
ALTER TABLE the_table ADD PARTITION (year = '2019', month = '08', day = '10') LOCATION 's3://some-bucket/data/2019/08/10/'
另请参阅https://docs.aws.amazon.com/athena/latest/ug/alter-table-add-partition.html https://docs.aws.amazon.com/athena/latest/ug/alter-table-add-partition.html
我什至想说你应该避免使用MSCK REPAIR TABLE …
共。它很慢,并且分区越多,速度只会变得更慢。运行效率更高ALTER TABLE … ADD PARTITION …
当您在 S3 上添加新数据时,因为您知道刚刚添加的内容以及它在哪里,所以不需要告诉 Athena 扫描整个前缀。直接使用 Glue API 速度更快,但不幸的是,这需要更多代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)