首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MSCK修复表命令只有在重新创建表之后才能工作。

MSCK修复表命令只有在重新创建表之后才能工作。
EN

Stack Overflow用户
提问于 2021-06-09 21:13:55
回答 2查看 472关注 0票数 1

MSCK REPAIR TABLE命令只在重新创建表之后添加分区。

MSCK修复表没有将分区添加到表中,但它列出了不位于亚稳态中的分区。但是,当我重新创建该表并运行MSCK修复表命令时,它可以工作。但是第二天,我运行MSCK修复表命令,将新的分区添加到亚稳态,它不添加分区。但是,如果我再次重新创建该表并运行MSCK修复表命令,则将添加分区。

这个问题突然开始了,我不知道该怎么办。任何对可能发生的事情有任何了解的人都会受到极大的赞赏。

下面是当修复表失败时收到的消息。

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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'
)
EN

回答 2

Stack Overflow用户

发布于 2021-07-01 10:08:57

可以解释这一点的一个原因是,分区键实际上不是整数。请考虑以下查询:

代码语言:javascript
运行
复制
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的修理表这么慢?来解释原因)。

有一个解决方案,雅典娜将自动为您拾取分区:分割投影。您应该能够使用运动消防软管的例子开始工作。

票数 2
EN

Stack Overflow用户

发布于 2021-06-16 08:46:59

这里的问题是,您有int类型的分区,而MSCK REPAIR TABLE只在列类型为string时才正确地添加分区。

以下是一些替代方案:

  1. ALTER TABLE ADD PARTITION... https://docs.aws.amazon.com/athena/latest/ug/alter-table-add-partition.html
  2. 分区投影(推荐):https://docs.aws.amazon.com/athena/latest/ug/partition-projection.html
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67911781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档