【发布时间】:2023-03-06 04:08:01
【问题描述】:
我有一个外部表名 MIAC,我将其重命名为 MIAC_BKUP。另外,我使用 Alter 语句将外部表的位置从 MIAC 重命名为 MIAC_bkup。
现在我再次创建一个名为 MIAC 的新外部表来填充新值,但我看到 MIAC_BKUP 也只更新了新值,没有备份值。
我怀疑 Metastore 没有更新。我运行了 MSCK 修复,但没有成功。
都是分区表
【问题讨论】:
我有一个外部表名 MIAC,我将其重命名为 MIAC_BKUP。另外,我使用 Alter 语句将外部表的位置从 MIAC 重命名为 MIAC_bkup。
现在我再次创建一个名为 MIAC 的新外部表来填充新值,但我看到 MIAC_BKUP 也只更新了新值,没有备份值。
我怀疑 Metastore 没有更新。我运行了 MSCK 修复,但没有成功。
【问题讨论】:
因此,您的流程中有 3 件事发生了变化。
hdfs:///<some-lcoation>/MIAC 重命名为 hdfs:///<some-lcoation>/MIAC_bkup(您也这样做了)ALTER TABLE MIAC_bkup SET LOCATION "hdfs:///<some-lcoation>/MIAC_bkup"
因此,当您将数据添加到新 MIAC 时,备份表和新表都指向 hdfs:///<some-lcoation>/MIAC。这就是您在通过新表添加的备份表中看到数据的原因。
到这里为止,一切都应该适合您。 即使您不必进行 msck 修复。
我相信你没有分区,因为在那种情况下你的问题会有所不同。
但是如果表有分区,请按照这些额外的步骤操作。
在元数据中,hive 还存储分区位置。 因此,您现有的分区元数据不知道位置更改。 您还需要刷新分区元数据。
MSCK REPAIR 单独无法完成这项工作。您必须首先从元数据中删除所有分区信息,然后执行 MSCK 以同步备份位置中的旧分区。
-- drop all partiotion
ALTER TABLE MIAC_bkup DROP PARTITION(partition_name <> ''); --refer this to understand
-- repair table
MSCK REPAIR TABLE MIAC_bkup;
注意:MSCK 修复不会删除分区,它只会添加或检查不一致
【讨论】: