herryyy 2014-12-17
1 hive数据加载方式:
a) 使用load加载
b) 用查询语句向表中插入数据
a) 使用LOAD DATA方式加载数据详解:
命令格式如下
LOAD DATA 【LOCAL】 INPATH ‘....’ 【OVERWRITE】 INTO TABLE t1 【PARTITION (...)】 eg: load data local inpath '/usr/local/data/user' into table jiuye partition(grade='1');
以上内容中,方括号中的表示可选部分。分别解释以下:
LOCAL 表示从本地加载数据,即Linux文件系统,这时数据会复制到HDFS的Hive仓库中;如果不使用LOCAL,指的是数据从HDFS的某个路径移动到Hive仓库中。
OVERWRITE指的是否覆盖原始数据。如果不使用OVERWRITE,但是已经导入过这批数据,那么新的导入依然能够成功,即产生两份,而不是覆盖掉原来的那一份
PARTITION指的是导入到指定分区表中。
b) 使用查询语句向表中插入数据详解:
INSERT OVERWRITE TABLE t1 SELECT * FROM t2; // 也可以不覆盖,直接导入,把关键词OVERWRITE替换为INTO即可 数据加载到一个分区中写法: INSERT OVERWRITE TABLE t2 PARTITION (day=2) SELECT * FROM t1;//将t1表的数据加载到分区为day=2的表t2中 数据同时加载到多个分区中/或者同时加载到多个表中(数据源只有一个) 可以这么写: INSERT OVERWRITE TABLE t2 PARTITION (day=2) SELECT * FROM t1; INSERT OVERWRITE TABLE t2 PARTITION (day=3) SELECT * FROM t1; ..... 这么写的坏处是SELECT * FROM t1每一次都会进行一次遍历,这样耗时, 将t1中day=2的id写入到表t2的分区day=2文件夹下的文件中 将t1中day=3的id写入到表t2的分区day=3文件夹下的文件中 将t1中day=4的id写入到表t4中 改进写法:(只扫描一次原始表,高效) FROM t1 INSERT OVERWRITE TABLE t2 PARTITION(day=2) SELECT id WHERE day=2 INSERT OVERWRITE TABLE t2 PARTITION(day=3) SELECT id WHERE day=3 INSERT OVERWRITE TABLE t4 SELECT id WHERE day=4
c) 动态分区插入:
插入数据时,分区数据是动态的,不是如上面静态写死的, 默认,Hive是支持动态分区插入的。如果不支持的话,可以设置 hive.exec.dynamic.partition=true;打开 动态分区插入语法如下 set hive.exec.dynamic.partition=true; set hive.exec.dynamic.partition.mode=nonstrict; set hive.exec.max.dynamic.partitions.pernode=1000; INSERT OVERWRITE TABLE t2 PARTITION (province, city) SELECT ....... , a.province, a.city FROM a; 注意: 动态分区字段一定要放在所有静态字段的后面,这里业务字段在前,最后 a.province, a.city作为动态分区字段会被赋到PARTITION (province, city)中 INSERT OVERWRITE TABLE t2 PARTITION (province, city) SELECT 业务字段 , a.province, a.city FROM a;
d) 动静态分区插入结合使用:
INSERT OVERWRITE TABLE t2 PARTITION (province=’beijing’, city) SELECT ....... , a.city FROM a; 此时,SELECT ....... , 都是作为业务字段被赋值到t2表中的,而 a.city则是作为动态分区字段查询到后赋值到 t2的分区字段中的。
2 hive数据导出方式:
一是直接使用HDFS命令导出文件夹。
二是使用如下语法
insert overwrite local directory ‘/tmp/t1’ SELECT id FROM t1; // directory表示存放目录
// 将t1的id数据导出到本地磁盘文件 /tmp/t1中