簡體   English   中英

MSCK 修復表命令僅在重新創建表后才有效

[英]MSCK Repair table command works only after the table is recreated

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 存儲桶中有那個分區,它會在我重新創建 athena 表時添加分區。

下面是表的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'
)

這里的問題是您有 int 類型的分區,而MSCK REPAIR TABLE只會在列類型為字符串時正確添加分區。

以下是一些替代方案:

  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

可以解釋這一點的一個原因是您的分區鍵實際上不是整數。 考慮這個查詢:

SELECT *
FROM prod_partner_visits
WHERE year = 2021
AND month = 6
AND day = 9
AND hour = 3

Athena 將查找帶有鍵 (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 – 注意前導零。

這不是MSCK REPAIR TABLE失敗的原因,但我認為它說明了問題。 我懷疑當它讀取例如“09”並將其解釋為 integer 9 時,該命令內部會發生類似的事情。

除了為新表加載分區時, MSCK REPAIR TABLE不是很好用。 您不應該連續使用它,因為它的效率非常低(請參閱Why is MSCK REPAIR TABLE so slow?了解原因)。

有一個解決方案,Athena 會自動為您選擇分區: 分區投影 您應該可以使用Kinesis Firehose 的示例開始。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM