将Hive表从一个数据库转移到另一个数据库

32

我需要将一个Hive表从一个数据库移动到另一个数据库,该怎么做?

8个回答

77

从0.14版本开始,您可以使用以下语句将表从一个数据库移动到同一metastore中的另一个数据库:

use old_database;
alter table table_a rename to new_database.table_a

如果table_a是托管表,上述语句还将移动HDFS上的表数据。


1
最快、最简单的解决方案。不知道为什么我和很多人都没有想到。:| 谢谢。应该被接受的答案。 - pratpor
如果您使用的是Hive metastore 0.14+,那么这就是正确的答案。 - Myles Baker
1
@user2942227 - 为什么这个答案还没有被接受呢? - Ramesh
我正在使用Hive 2.1.1,该表是托管的,但是重命名时文件/表数据没有移动。是否还有其他需要做的事情,以便文件随之移动? - Topde

4
你可以尝试使用 CTAS。具体信息请参考 这里
USE NEW_DB;

CREATE TABLE table
AS
SELECT * FROM OLD_DB.table;

DROP TABLE OLD_DB.table;

1
简洁明了,我喜欢!请注意,CTAS 有以下限制: 1)目标表不能是外部表。 2)目标表不能是列表分桶表。 - KeyMaker00

4

创建外部表 new_db.table, 类似于 old_db.table 的位置为 '(hdfs文件的路径)';

如果表中有分区,则必须在 new_db.table 中添加分区。


3

这可能对您有所帮助。

EXPORT TABLE table_or_partition TO hdfs_path;
IMPORT [[EXTERNAL] TABLE table_or_partition] FROM hdfs_path [LOCATION[table_location]];

一些示例语句可能如下:

EXPORT TABLE <table name> TO 'location in hdfs';

Use test_db;
IMPORT FROM 'location in hdfs';

Export Import can be appled on a partition basis as well:
EXPORT TABLE <table name> PARTITION (loc="USA") to 'location in hdfs';

以下导入命令是将数据导入到外部表而不是托管表中。
IMPORT EXTERNAL TABLE FROM 'location in hdfs' LOCATION ‘/location/of/external/table’;

1
如果表被划分,则基本上可以将分区数据从旧表复制到新表,然后删除旧表。
  1. use new_db;
  2. Create new table in new database:

    Create Table table_name;
    
  3. Insert data in new tables from old tables using the command:

    insert into new_table_name partition (partition_column='value') 
      select col1, col2, col3, col4 from old_db.old_table_name 
      where partition_column='value';
    

0

虽然有很多方法在答案中提供,但没有指导何时使用哪种方法。

  1. 如果您的目标是托管表,请使用CTAS:

    CREATE NEW_DB.TABLE table AS SELECT * FROM OLD_DB.TABLE;
    DROP TABLE OLD_DB.TABLE;
    
  2. 如果您只想更改表名,但表的位置不变:

    alter table old_database.table_a rename to new_database.table_a;
    
  3. 使用CREATE LIKE和INSERT:

    CREATE NEW_DB.TABLE table LIKE OLD_DB.TABLE;
    INSERT INTO TABLE new_table_name partition (partition_column) select col1, col2, col3, col4 from old_db.old_table_name where partition_column='value';
    DROP TABLE old_db.old_table_name;
    

0

您想要迁移的数据库应该已经提供了一个数据库连接器。借助sqoop和数据库连接器,您可以将其迁移。如果您能更具体地说明要将数据迁移到哪种类型的数据库中,那就更好了。


1
我想仅在Hive中迁移到另一个数据库。 - user2942227

0

https://issues.apache.org/jira/browse/HIVE-2496

这个改进仍然是开放的。我知道在Impala中可能实现,但目前在Hive中不行。

开发似乎停滞了。您可以在该页面上投票支持该问题以引起一些关注。


HIVE-2496已由HIVE-9180修复。尽管目前还没有关闭HIVE-2496。正如Jay所提到的,现在可以在数据库之间重命名Hive表(自版本0.14起)。 - Tagar

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