【问题标题】:MSCK Repair table command works only after the table is recreatedMSCK 修复表命令仅在重新创建表后才有效
【发布时间】:2021-08-26 21:48:11
【问题描述】:

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

MSCK 修复表不会将分区添加到表中,但会列出不在 Metastore 中的分区。但是,当我重新创建表并运行 MSCK 修复表命令时,它可以工作。但是第二天我运行 MSCK 修复表命令将新分区添加到 Metastore,它没有添加分区。但是,如果我再次重新创建表并运行 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'
)

【问题讨论】:

  • 你能告诉我们当你试图修复桌子但它失败时它说什么吗?
  • 以下是我在修复表失败时收到的消息。不在 Metastore 中的分区:prod_partner_visits:year=2021/month=06/day=09/hour=00 文件系统中缺少分区:prod_partner_visits:year=2021/month=06/day=09/hour=00
  • 它想要添加相同的目录,然后从存储中报告为“丢失”,这似乎很奇怪。你有任何文件存储在那个目录中吗?
  • 是的,我在目录中有文件。
  • 你能发布表定义吗(例如通过generate create table ddl)?

标签: amazon-web-services amazon-athena


【解决方案1】:

这里的问题是你有 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

【讨论】:

    【解决方案2】:

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

    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”并将其解释为整数 9 时,该命令内部会发生类似的事情。

    MSCK REPAIR TABLE 在为新表加载分区时不太好用。您不应该连续使用它,因为它的效率非常低(请参阅Why is MSCK REPAIR TABLE so slow? 了解原因)。

    有一个解决方案,Athena 会自动为您选择分区:Partition Projection。您应该可以使用example for Kinesis Firehose 开始使用。

    【讨论】:

      猜你喜欢
      • 2019-01-13
      • 2013-07-12
      • 2022-07-05
      • 1970-01-01
      • 1970-01-01
      • 2013-06-23
      • 1970-01-01
      • 2014-05-14
      • 2019-10-22
      相关资源
      最近更新 更多