MSCK REPAIR TABLE命令只在重新创建表之后添加分区。
MSCK修复表没有将分区添加到表中,但它列出了不位于亚稳态中的分区。但是,当我重新创建该表并运行MSCK修复表命令时,它可以工作。但是第二天,我运行MSCK修复表命令,将新的分区添加到亚稳态,它不添加分区。但是,如果我再次重新创建该表并运行MSCK修复表命令,则将添加分区。
这个问题突然开始了,我不知道该怎么办。任何对可能发生的事情有任何了解的人都会受到极大的赞赏。
下面是当修复表失败时收到的消息。
Partitions not in metastore:
prod_partner_visits:year=2021/month=06/day=09/hour=00
Partitions missing from filesystem:
prod_partner_visits:year=2021/month=06/day=09/hour=00但是我在s3桶中有这个分区,当我重新创建雅典娜表时,它会添加这个分区。
下面的是表的DDL
CREATE EXTERNAL TABLE `prod_partner_visits`(
`visitortoken` string COMMENT 'from deserializer',
`timestamp` string COMMENT 'from deserializer',
`timeuuid` string COMMENT 'from deserializer',
`event` string COMMENT 'from deserializer',
`message` string COMMENT 'from deserializer'
)
PARTITIONED BY (
`year` int,
`month` int,
`day` int,
`hour` int
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat'
LOCATION 's3://partner-traffic-channel-prod/topics/prod-cp-channel-visit'
TBLPROPERTIES (
'has_encrypted_data'='false',
'transient_lastDdlTime'='1623329273'
)发布于 2021-07-01 10:08:57
可以解释这一点的一个原因是,分区键实际上不是整数。请考虑以下查询:
SELECT *
FROM prod_partner_visits
WHERE year = 2021
AND month = 6
AND day = 9
AND hour = 3雅典娜将寻找一个分区与键(2021,6,9,3),对应的位置s3://partner-traffic-channel-prod/topics/prod-cp-channel-visit/year=2021/month=6/day=9/hour=3。然而,正确的位置是…/year=2021/month=06/day=09/hour=03 - notice前导零。
这不是MSCK REPAIR TABLE失败的原因,但我认为它说明了这个问题。当该命令读取"09“并将其解释为整数9时,我怀疑类似的情况。
除了为新表加载分区时,MSCK REPAIR TABLE不太适合使用。您不应该继续使用它,因为它非常低效(请参见为什么MSCK的修理表这么慢?来解释原因)。
发布于 2021-06-16 08:46:59
这里的问题是,您有int类型的分区,而MSCK REPAIR TABLE只在列类型为string时才正确地添加分区。
以下是一些替代方案:
ALTER TABLE ADD PARTITION... https://docs.aws.amazon.com/athena/latest/ug/alter-table-add-partition.htmlhttps://stackoverflow.com/questions/67911781
复制相似问题