如何重命名Hive表而不改变其位置?

33
根据以下Hive文档:
重命名表 ALTER TABLE table_name RENAME TO new_table_name; 此语句允许您将一个表的名称更改为不同的名称。 从版本0.6开始,对管理表进行的重命名也会移动其HDFS位置。(旧版本的Hive仅在元存储中重命名表而不移动HDFS位置。)
有没有办法重命名表而不更改位置?

你尝试过使用外部表而不是Hive管理的表吗?请参考:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-ExternalTables - Stefan Papp
即使使用“受管控的”表,您也应该能够设置非默认位置 => RENAME,然后将位置更改回原始默认值,然后将所有HDFS文件移回...此时您应该问自己:为什么需要强制位置?这有意义吗?您没有给出任何理由,因此我认为这是一个坏主意。 - Samson Scharfrichter
4个回答

35

是的,我们可以这样做。您只需要按照以下三个命令顺序进行操作。

  1. 假设您在Hive中有一个外部表test_1。您想将其重命名为test_2,该表应指向test_2位置而不是test_1位置。那么您需要使用以下命令将此表转换为托管表。 test_1 -> 指向test_1位置

ALTER TABLE db_name.test_1 SET TBLPROPERTIES('EXTERNAL'='FALSE');
  • 重命名表名。

    ALTER TABLE db_name.test_1 RENAME TO db_name.test_2;
    
  • 重命名后,再次将托管表转换为外部表。

    ALTER TABLE db_name.test_2 SET TBLPROPERTIES('EXTERNAL'='TRUE');
    
  • db_name.test_2表将指向test_2位置。如果我们在没有创建托管表的情况下这样做,它将指向test_1位置。


    7

    在Hive中,ALTER TABLE语句的语法与CREATE或SELECT不同,它不遵循databasename.tablename的格式。需先提及数据库名称,然后再运行alter table语句。

    语法如下:

    USE databasename;
    ALTER TABLE old_tablename RENAME TO new_tablename;
    

    5

    从Hive 2.2.0开始,只有当创建的表没有LOCATION子句并且位于其数据库目录下时,管理表的HDFS位置才会被移动。链接


    2
    以下是执行的命令:

    最初的回答

    ALTER TABLE old_ratings RENAME TO ratings;
    

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接