目录
一、通过LOAD DATA 命令
1、不指定分区
1)、从本地文件系统中导入数据到Hive表
2)、从HDFS上导入数据到Hive表
2、指定分区
二、把select查询的结果插入到指定的表中
1、静态分区导入
2、动态分区导入
3、多表插入
三、在创建表的时候通过从别的表中查询出相应的记录并插入到所创建的表中create table .. as select
四、把数据文件直接挂载到hive表的hdfs目录下
创建一个简单的hive表
create table test(
id int, name string,tel string)
partitioned by (age int)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE;
LOAD DATA (LOCAL )INPATH ... (OVERWRITE) INTO TABLE tablename
LOCAL :有这个关键字说明是本地的文件,没有的话说明是hdfs上的文件;
OVERWRITE:有这个关键字说明是是覆盖,没有的话是追加;
LOAD DATA LOCAL INPATH './examples/files/kv1.txt' OVERWRITE INTO TABLE test;
使用LOCAL代表的是本地目录下的文件
从本地文件系统中将数据导入到Hive表的过程中,其实是先将数据临时复制到HDFS的一个目录下(典型的情况是复制到上传用户的HDFS home目录下,比如/home/user/),然后再将数据从那个临时目录下移动(注意,这里说的是移动,不是复制!)到对应的Hive表的数据目录里 面。
而不带LOCAL的则表示使用的是Hadoop上的HDFS上路径下的文件,如
LOAD DATA INPATH '/user/myname/kv2.txt' OVERWRITE INTO TABLE test;
LOAD DATA LOCAL INPATH './examples/files/kv2.txt' OVERWRITE INTO TABLE test PARTITION (ds='2008-08-15');
分区:在Hive中,表的每一个分区对应表下的相应目录,所有分区的数据都是存储在对应 的目录中。比如test表有dt和city两个分区,则对应dt=20131218,city=BJ对应表的目录为/user/hive /warehouse/dt=20131218/city=BJ,所有属于这个分区的数据都存放在这个目录中。
insert into table test partition (age='25') select id, name,tel from test1;
把test1表的数据按照分区age来导入,这种方式称为静态分区;
insert into table test partition (age) select id, name,tel,age from test1;
这种方法叫做动态分区插入,但是Hive中默认是关闭的,所以在使用前需要先把hive.exec.dynamic.partition.mode设置为 nonstrict。
Hive还支持多表插入在Hive中,我们可以把insert语句倒过来,把from放在最前面,它的执行效果和放在后面是一样的,如下:
from test
insert into table test1 partition(age) select id, name, tel, age
insert into table test2 select id, name where age>25;
在实际情况中,表的输出结果可能太多,不适于显示在控制台上,这时候,将Hive的查询输出结果直接存在一个新的表中是非常方便的,我们称这种情况为CTAS(create table .. as select)如下:
create table test4 as select id, name, tel from test;