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

Posted

技术标签:

【中文标题】将 hive 表从一个数据库转移到另一个【英文标题】:Transferring hive table from one database to another 【发布时间】:2014-04-21 21:43:41 【问题描述】:

我需要将配置单元表从一个数据库移动到另一个数据库。我该怎么做?

【问题讨论】:

【参考方案1】:

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

use old_database;
alter table table_a rename to new_database.table_a

如果table_a 是托管表,上述语句也会移动hdfs 上的表数据。

【讨论】:

最快最简单的解决方案。想知道为什么它没有点击我和这么多人。 :|谢谢。应该是公认的答案。 这是正确的答案,前提是您使用的是 Hive Metastore 0.14+。 @user2942227 - 为什么这个答案还没有被接受? 我使用的是 hive 2.1.1,表是托管的,文件/表数据不会随着重命名而移动。我还需要做什么才能让文件随之移动吗?【参考方案2】:

创建外部表 new_db.table like old_db.table location '(hdfs 文件中的文件路径)';

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

【讨论】:

【参考方案3】:

你可以试试-CTAS

USE NEW_DB;

CREATE TABLE table
AS
SELECT * FROM OLD_DB.table;

DROP TABLE OLD_DB.table;

【讨论】:

简洁明了,我喜欢!注意CTAS有这些限制:1)目标表不能是外部表。 2) 目标表不能是列表分桶表。【参考方案4】:

这可能对你有帮助。

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’;

【讨论】:

【参考方案5】:

如果表是分区的,那么基本上你可以将分区数据从旧表复制到新表并删除旧表。

    use new_db;

    在新数据库中创建新表:

    Create Table table_name;
    

    使用以下命令将旧表中的数据插入新表中:

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

【讨论】:

【参考方案6】:

您要迁移的数据库会为您提供数据库连接器。在 sqoop 和数据库连接器的帮助下,您可以迁移它。如果您更具体地了解要将数据迁移到的数据库类型,那就太好了

【讨论】:

我只想迁移到 hive 中的另一个数据库【参考方案7】:

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

这种改进仍然存在。我知道在 Impala 中是可能的,目前在 Hive 中是不可能的。

发展似乎停滞不前。您可以在该页面上为该问题投票以引起关注。

【讨论】:

HIVE-2496 已由 HIVE-9180 修复。尽管尚未有人关闭 HIVE-2496。正如 Jay 所说,现在可以(从 0.14 开始)在数据库之间重命名 Hive 表。【参考方案8】:

答案中给出了许多方法,但没有关于何时使用什么的指南,

    当您的目标是托管表时使用 CTAS:

    CREATE NEW_DB.TABLE table AS SELECT * FROM OLD_DB.TABLE;
    DROP TABLE OLD_DB.TABLE;
    

    如果您只想通过简单的表名更改来完成,但表的位置没有改变:

    alter table old_database.table_a rename to new_database.table_a;
    

    使用 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;
    

【讨论】:

以上是关于将 hive 表从一个数据库转移到另一个的主要内容,如果未能解决你的问题,请参考以下文章

oracle 中如何将一张500万数据的表从一个库快速转移到另外一个库

如何将表从一个mysql数据库复制到另一个mysql数据库

将多个表从一个数据库复制到另一个

将表从一个数据库复制到另一个

将相关表从一个 Microsoft Access Web App 迁移到另一个的有效方法?

将表从一个数据库复制到另一个数据库的最简单方法?