Hive中如何快速的复制一张分区表(包括数据)

转自:http://lxw1234.com/archives/2015/09/484.htm

关键字:Hive 复制表

Hive中有时候会遇到复制表的需求,复制表指的是复制表结构和数据。

如果是针对非分区表,那很简单,可以使用CREATE TABLE new_table AS SELECT * FROM old_table;

那么如果是分区表呢?

首先想到的办法可能是:

先创建一张和old_table结构相同的new_table,包括分区;可以使用CREATE TABLE new_table LIKE old_table;

接下来使用动态分区,把old_table的数据INSERT到new_table中。

这个方法当然可以,但可能不是最快的。

其实可以这样做:

1. CREATE TABLE new_table LIKE old_table;

2. 使用hadoop fs -cp 命令,把old_table对应的HDFS目录的文件夹全部拷贝到new_table对应的HDFS目录下;

3. 使用MSCK REPAIR TABLE new_table;修复新表的分区元数据;

看例子:

有一张分区表t1,只有两个分区,每个分区中都有一条数据,如下:

  1. hive> show partitions t1;
  2. OK
  3. pt=2015-09-11
  4. pt=2015-09-12
  5. Time taken: 0.11 seconds, Fetched: 2 row(s)
  6. hive> desc t1;
  7. OK
  8. id string
  9. pt string
  10. # Partition Information
  11. # col_name data_type comment
  12. pt string
  13. Time taken: 0.123 seconds, Fetched: 7 row(s)
  14. hive> select * from t1;
  15. OK
  16. X 2015-09-11
  17. Y 2015-09-12
  18. Time taken: 0.095 seconds, Fetched: 2 row(s)
  19. hive>

创建一张相同表结构的新表t2;

  1. hive> create table t2 like t1;
  2. OK
  3. Time taken: 0.162 seconds
  4. hive> desc t2;
  5. OK
  6. id string
  7. pt string
  8. # Partition Information
  9. # col_name data_type comment
  10. pt string
  11. Time taken: 0.139 seconds, Fetched: 7 row(s)
  12. hive> show partitions t2;
  13. OK
  14. Time taken: 0.082 seconds

使用hadoop fs -cp命令把t1对应HDFS目录的所有文件夹复制到t2对应的HDFS目录下:

  1. [[email protected] ~]$ hadoop fs -cp /hivedata/warehouse/liuxiaowen.db/t1/* /hivedata/warehouse/liuxiaowen.db/t2/
  2. [[email protected] ~]$ hadoop fs -ls /hivedata/warehouse/liuxiaowen.db/t2/
  3. Found 2 items
  4. drwxr-xr-x - liuxiaowen liuxiaowen 0 2015-09-11 17:17 /hivedata/warehouse/liuxiaowen.db/t2/pt=2015-09-11
  5. drwxr-xr-x - liuxiaowen liuxiaowen 0 2015-09-11 17:17 /hivedata/warehouse/liuxiaowen.db/t2/pt=2015-09-12

在Hive用使用MSCK REPAIR TABLE t2;修复新表t2的分区元数据;

  1. hive> show partitions t2;
  2. OK
  3. Time taken: 0.082 seconds
  4. hive> MSCK REPAIR TABLE t2;
  5. OK
  6. Partitions not in metastore: t2:pt=2015-09-11 t2:pt=2015-09-12
  7. Repair: Added partition to metastore t2:pt=2015-09-11
  8. Repair: Added partition to metastore t2:pt=2015-09-12
  9. Time taken: 0.249 seconds, Fetched: 3 row(s)
  10. hive> show partitions t2;
  11. OK
  12. pt=2015-09-11
  13. pt=2015-09-12
  14. Time taken: 0.068 seconds, Fetched: 2 row(s)
  15. hive> select * from t2;
  16. OK
  17. X 2015-09-11
  18. Y 2015-09-12
  19. Time taken: 0.123 seconds, Fetched: 2 row(s)
  20. hive>

OK,新表t2已经复制好了,它和t1有着相同的表结构,分区结构,分区以及数据。

时间: 2024-11-10 00:57:59

Hive中如何快速的复制一张分区表(包括数据)的相关文章

复制一张表的数据到另一张表,jq.grid里面有时间类型数据时展示不了数据

1.复制一张表的数据到另一张表 insert into jct_sys_lock_tbl_new  (BGN_DT, END_DT, TYPE, DESCR, flag, format, range, count)  select BGN_DT, END_DT, TYPE, DESCR, flag, format, range, count    from jct_sys_lock_tbl 也可以: insert into jct_sys_lock_tbl_new  select *    fr

【甘道夫】Sqoop1.4.4 实现将 Oracle10g 中的增量数据导入 Hive0.13.1 ,并更新Hive中的主表

需求 将Oracle中的业务基础表增量数据导入Hive中,与当前的全量表合并为最新的全量表. ***欢迎转载,请注明来源***    http://blog.csdn.net/u010967382/article/details/38735381 设计 涉及的三张表: 全量表:保存了截止上一次同步时间的全量基础数据表 增量表:增量临时表 更新后的全量表:更新后的全量数据表 步骤: 通过Sqoop将Oracle中的表导入Hive,模拟全量表和增量表 通过Hive将"全量表+增量表"合并为

使用sqoop将mysql数据导入到hive中

首先准备工具环境:hadoop2.7+mysql5.7+sqoop1.4+hive3.1 准备一张数据库表: 接下来就可以操作了... 一.将MySQL数据导入到hdfs 首先我测试将zhaopin表中的前100条数据导出来,只要id.jobname.salarylevel三个字段. 再Hdfs上创建目录 hadoop fs -mkdir -p /data/base #用于存放数据 我们cd到sqoop目录下执行命令 # \ 用于换行bin/sqoop import --connect jdbc

SQLSERVER中如何快速比较两张表的不一样

一般来说,如何检测两张表的内容是否一致,体现在复制的时候发布端和订阅端的两端的数据上面 我这里罗列了一些如何从数据库层面来解决此类问题的方法 第一步当然就是检查记录数是否一致,否则不用想其他方法了~这里我们用两张表t1_old,t1_new来演示 方法介绍 方法一:老老实实看表结构和表记录数,弊端是根本看不到两张表的数据是否一致,只是看到表结构和记录数是否一致 --表结构: CREATE TABLE t1_old ( id int NOT NULL, log_time DATETIME DEFA

hive中rcfile格式(收藏文)

首先声明,此文是属于纯粹收藏文,感觉讲的很不错. 本文介绍了Facebook公司数据分析系统中的RCFile存储结构,该结构集行存储和列存储的优点于一身,在MapReduce环境下的大规模数据分析中扮演重要角色. Facebook曾在2010 ICDE(IEEE International Conference on Data Engineering)会议上介绍了数据仓库Hive.Hive存储海量数据在Hadoop系统中,提供了一套类数据库的数据存储和处理机制.它采用类SQL语言对数据进行自动化

使用sql语句复制一张表

如何使用sql语句复制一张表? 第一步:先建一张新表,新表的结构与老表相等. create table newbiao like chengjibiao(老表名); 第二步:将老表中的值复制到新标中. insert into newbiao SELECT * from chengjibiao(老表名);

hive中order by,sort by, distribute by, cluster by作用以及用法

1. order by Hive中的order by跟传统的sql语言中的order by作用是一样的,会对查询的结果做一次全局排序,所以说,只有hive的sql中制定了order by所有的数据都会到同一个reducer进行处理(不管有多少map,也不管文件有多少的block只会启动一个reducer).但是对于大量数据这将会消耗很长的时间去执行. 这里跟传统的sql还有一点区别:如果指定了hive.mapred.mode=strict(默认值是nonstrict),这时就必须指定limit来

hive中partition如何使用

1.背景 1.在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作.有时候只需要扫描表中关心的一部分数据,因此建表时引入了partition概念. 2.分区表指的是在创建表时指定的partition的分区空间. 3.如果需要创建有分区的表,需要在create表的时候调用可选参数partitioned by,详见表创建的语法结构. 2.细节 1.一个表可以拥有一个或者多个分区,每个分区以文件夹的形式单独存在表文件夹的目录下. show partitions stage_

使用Sqoop,最终导入到hive中的数据和原数据库中数据不一致解决办法

Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql.postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中. 1.问题背景 使用Sqoop把oracle数据库中的一张表,这里假定为student,当中的数据导入到hdfs中,然后再创建hive的external表,location到刚才保存到hdfs中数