在使用Hive的过程中,复制表结构和数据是很常用的操作,本文介绍两种复制表结构和数据的方法。

1、复制非分区表表结构和数据

Hive集群中原本有一张bigdata17_old表,通过下面的SQL语句可以将bigdata17_old的表结构和数据复制到bigdata17_new表:

CREATE TABLE bigdata17_new AS SELECT * FROM bigdata17_old;

如果是分区表,则必须使用like关键字复制表结构,包括分区,然后用insert语句将老表的数据插入新表中。

2、复制分区表表结构和数据

复制表SQL:

CREATE TABLE bigdata17_new like bigdata17_old;

复制数据sql:

insert overwrite table bigdata17_new partition(dt) select * from bigdata17_old;

如果遇到bigdata17_old表数据量巨大,有T以上的级别时,上述方法的效率则比较低。下面介绍一种快速复制表结构和表数据的方法。

从旧表中复制表结构,这个和上面介绍方法是一样的:

CREATE TABLE bigdata17_new like bigdata17_old;

然后使用hadoop fs - cp命令将bigdata17_old旧表的数据拷贝到bigdata17_new新表:

hadoop fs -cp /user/warehouse/bigdata17.db/bigdata17_old/* /user/warehouse/bigdata17.db/bigdata17_new/

然后执行 MSCK REPAIR TABLE new_table;命令让两张表的分区元数据保持一致。

详细使用过程如下:

bigdata17_old表有两个字段,id和dt,其中dt是分区字段,一共有4条记录,两个分区:

hive> desc bigdata17_old;
OK
id int
dt string # Partition Information
# col_name data_type comment dt string
Time taken: 0.147 seconds, Fetched: 7 row(s) hive> select * from bigdata17_old;
OK
15 2018-10-13
18 2018-10-13
12 2018-10-14
13 2018-10-14
Time taken: 0.118 seconds, Fetched: 4 row(s) hive> show partitions bigdata17_old;
OK
dt=2018-10-13
dt=2018-10-14
Time taken: 0.113 seconds, Fetched: 2 row(s)

创建表结构和bigdata17_old表一模一样的表bigdata17_new:

create table bigdata17_new like bigdata17_old;

查看表bigdata17_new的表结构:

hive> show partitions bigdata17_new;
OK
Time taken: 0.153 seconds
hive> desc bigdata17_new;
OK
id int
dt string # Partition Information
# col_name data_type comment dt string
Time taken: 0.151 seconds, Fetched: 7 row(s)

由于表bigdata17_new还没有数据,因此该表中没有分区信息。

将bigdata17_old目录下的数据文件拷贝到bigata17_new目录下:

[root@hadoop-master hive_test]# hadoop fs -cp /user/hive/warehouse/bigdata17.db/bigdata17_old/* /user/hive/warehouse/bigdata17.db/bigdata17_new/;
18/10/13 19:02:54 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
[root@hadoop-master hive_test]# hadoop fs -ls /user/hive/warehouse/bigdata17.db/bigdata17_new/
18/10/13 19:03:26 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 2 items
drwxr-xr-x - root supergroup 0 2018-10-13 19:02 /user/hive/warehouse/bigdata17.db/bigdata17_new/dt=2018-10-13
drwxr-xr-x - root supergroup 0 2018-10-13 19:02 /user/hive/warehouse/bigdata17.db/bigdata17_new/dt=2018-10-14

查看表bigdata17_new的分区信息:

hive> show partitions bigdata17_new;
OK
Time taken: 0.125 seconds

虽然数据拷贝过来了,但是表bigdata17_new的分区信息还没更新到metastore中,因此需要使用MSCK命令修复bigdata17_new的分区信息,执行该命令后就会把bigdata17_new的分区信息更新到hive metastore中:

hive> MSCK REPAIR TABLE bigdata17_new;
OK
Partitions not in metastore: bigdata17_new:dt=2018-10-13 bigdata17_new:dt=2018-10-14
Repair: Added partition to metastore bigdata17_new:dt=2018-10-13
Repair: Added partition to metastore bigdata17_new:dt=2018-10-14
Time taken: 0.21 seconds, Fetched: 3 row(s)

查看表bigdata17_new的表结构和查询表数据:

hive> show partitions bigdata17_new;
OK
dt=2018-10-13
dt=2018-10-14
Time taken: 0.137 seconds, Fetched: 2 row(s)
hive> select * from bigdata17_new;
OK
15 2018-10-13
18 2018-10-13
12 2018-10-14
13 2018-10-14
Time taken: 0.099 seconds, Fetched: 4 row(s)

表bigdata17_new已经创建完毕,它的表结构、分区信息和表bigdata17_old一样,数据也一模一样。

如果是跨Hive集群复制表和数据,又要怎么做呢?

其实和上述步骤差不多,只是因为跨Hive集群,新表和旧表之间不能使用hadoop cp命令拷贝数据。假设有两个集群,分区为Hive1和Hive2,两个Hive集群都有表bigdata17_order,表结构完全一样。怎么将集群Hive1中的bigdata17_order表的数据拷贝到集群Hive2中的bigdata17_order表中呢?下面介绍实现步骤:

1、将表Hive1集群bigdata17_order目录下的数据下载到本地:

hadoop fs -get /user/warehouse/bigdata17.db/bigdata17_order/* /home/hadoop/hivetest/bigdata17_order/

2、通过hadoop fs -put命令将本地数据上传到集群Hive2中的bigdata17_order目录中:

hadoop fs -put /home/hadoop/hivetest/bigdata17_order/* /user/warehouse/bigdata17.db/bigdata17_order/

3、在集群Hive2中执行MSCK命令修复表bigdata17_order的分区信息:

MSCK REPAIR TABLE bigdata17_order;

Hive MSCK命令的用法请参考:一起学Hive——使用MSCK命令修复Hive分区

总结

1、介绍复制Hive非分区表和数据的方法

2、介绍复制Hive分区表和数据的两种方法

3、介绍跨Hive集群拷贝分区表数据的方法。

一起学Hive——总结复制Hive表结构和数据的方法的更多相关文章

  1. MySQL 复制表(表结构、表结构和数据)

    MySQL 中使用 命令行 复制表结构及数据的方法主要有以下几种: 1.只复制表结构 CREATE TABLE new_table SELECT * FROM old_table WHERE 1=2: ...

  2. 复制表结构和数据SQL语句

    select * into 目标表名 from 源表名 insert into 目标表名(fld1, fld2) select fld1, 5 from 源表名 以上两句都是将 源表 的数据插入到 目 ...

  3. SQL复制表结构和数据

    1.复制表结构和数据 select * into 目的数据库名.dbo.目的表名 from 原表名 select * into my0735home.dbo.infoMianTest from inf ...

  4. SQL——表结构或数据的复制

    一.复制表结构及数据到新表 create table new_tb select * from old_tb 二.只复制表结构到新表 create table new_tb select * from ...

  5. orcale复制表结构及其数据

    http://hi.baidu.com/tag/Oracle/feeds http://hi.baidu.com/gqftuisidibabiq/item/14d306cc87cbdf45bcef69 ...

  6. Oracle复制表结构及数据

    1. 复制表结构及其数据:  create table table_name_new as select * from table_name_old 2. 只复制表结构:  ; 或者: create ...

  7. 【Oracle】【2】复制表结构及其数据

    --复制表结构及其数据 create table table_name_new as select * from table_name_old; --只复制表结构 ; --create table t ...

  8. Sqlite 复制表结构和数据

    复制表结构 ; 复制表结构和数据 create table newTb as select * from oldTb:

  9. mysql复制表结构和数据

    1.复制表结构: create table newName like oldName;//可以复制所有结构. 或者: create table newName select * from oldNam ...

随机推荐

  1. Linux中OCI开发库的配置

    Oracle调用接口(Oracle Call Interface,简称OCI)提供了一组可对Oracle数据库进行存取的接口子例程(函数),通过在第三代程序设计语言(如C语言)中进行调用可达到存取Or ...

  2. JS导出excel设置下载的标题/与angular结合冲突

    2017.8更新 此功能与angular结合使用时,最后一行 document.getElementById("dlink").click(); 与angular的ng-click ...

  3. c中perror函数

    写代码这么久,竟然很少用到perror函数,忘记了其强大的功能. 所在头文件: #include<stdio.h> 函数定义: void perror(const char *str); ...

  4. $Django 路飞之小知识回顾,Vue之样式element-ui,Vue绑定图片--mounted页面挂载--路由携带参数

    一 小知识回顾 1 级联删除问题 2 一张表关联多个表,比如有manytomanyfileds forignkey,基于对象查询存在的问题:反向查询的时候  表名小写_set.all()不知是哪个字段 ...

  5. 制作缩略图java工具类

    import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.File ...

  6. linux ln 命令使用参数详解(ln -s 软链接)

    ln是linux中一个非常重要的命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接.当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在 ...

  7. [C]控制外部变量访问权限的extern和static关键字

    一.extern 概述 编译器是由上至下编译源文件的,当遇到一些函数引用外部全局变量,而这个变量被定义在该函数声明主体的下方,又或者引用自其它的编译单元,这个情况就需要extern来向编译器表明此变量 ...

  8. GIT 版本管理-github&码云

    GIT 是什么 git是一个用于帮助用户实现版本控制的软件. 把本地代码push到远程服务器 git add.git commitpush code to remove machine.git pus ...

  9. Confluence 6 Windows 中以服务方式自动重启为服务手动安装 Confluence 分发包

    在 Windows: 打开一个命令输入框,然后修改目录到 <CONFLUENCE-INSTALL>/bin 目录中.你需要以管理员权限运行这个命令行输入框(Run as administr ...

  10. Confluence 6 配置管理员会话安全的备注

    禁用密码确定. Confluence 安装使用自定义授权机制有可能会在密码校验的时候遇到问题.如果必要的话,你可以设置 password.confirmation.disabled 系统属性来禁用密码 ...