【问题标题】:What happens if I move Hive table data files before moving the table?如果我在移动表之前移动 Hive 表数据文件会怎样?
【发布时间】:2021-02-10 15:16:11
【问题描述】:

我正在尝试将表的位置移动到新目录。假设原始位置是/data/dir。例如,我正在尝试这样的事情:

hadoop fs -mkdir /data/dir_bkp
hadoop fs -mv /data/dir/* /data/dir_bkp

然后我执行 hive 命令,例如:

ALTER TABLE db.mytable RENAME TO db.mytable_bkp;
ALTER TABLE db.mytable_bkp SET LOCATION /data/dir_bkp;

在更改表的位置之前移动目录文件可以吗?运行这些命令后,mytable_bkp 表是否会像以前一样填充?

【问题讨论】:

  • 已分区。所以我只需要在最后添加MSCK REPAIR TABLE db.mytable_bkp,即使先移动文件,备份表仍然会被填充?
  • 谢谢。那是位置是一个错字。但是,如果在位置包含数据的情况下加载了表,那么如果我首先移动文件,表会不会是空的?因为在我移动表格的位置之前,该位置没有数据。
  • @leftjoin 感谢您的帮助。我执行了上述命令,可以看到我的数据从dir 移动到dir_bkp,但是即使在运行msck repair table db.mytable_bkp 之后,表格也是空的。
  • 检查 SHOW PARTITIONS - 分区是否安装到旧位置?
  • 表是外部的还是托管的?如果它是外部的,您可以尝试删除并创建并再次运行 MSCK 我猜这可能是安装到旧位置的分区的问题。如果表是 MANAGED - 在删除之前将其置于外部

标签: hadoop hive hdfs hive-partitions hiveddl


【解决方案1】:

在你执行mv 命令后,你原来的表会变空。因为 mv 删除了数据文件。

重命名表后,它是空的,因为它的位置是空的。

在您执行ALTER TABLE SET LOCATION 之后 - 表为空,因为分区已安装到旧位置(现在为空)。很抱歉之前在此步骤中误导了您。重命名表后,分区保持重命名前的状态。每个分区通常可以在表位置之外有自己的位置。

如果表是 MANAGED,则将其设为 EXTERNAL:

alter table table_name SET TBLPROPERTIES('EXTERNAL'='TRUE'); 

现在 drop table + create table with new location 并运行 MSCK 来创建分区:

MSCK [REPAIR] TABLE tablename;

如果您使用的是 Amazon EMR,请运行 ALTER TABLE tablename RECOVER PARTITIONS; 而不是 MSCK

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-22
    • 1970-01-01
    • 2011-04-23
    • 2014-12-29
    • 2022-08-16
    • 1970-01-01
    相关资源
    最近更新 更多