Hive四种数据导入方式:
1) 从本地文件系统中导入数据到hive表;
hive>load data local inpath 'mytable.txt' into table mytabl;
注意:和我们熟悉的关系型数据库不一样,Hive现在还不支持在insert语句里面直接给出一组记录的文字形式,也就是说,Hive并不支持INSERT INTO …. VALUES形式的语句。
2) 从hdfs上导入数据到hive表;
从本地文件系统中将数据导入到Hive表的过程中,其实是先将数据临时复制到HDFS的一个目录下(典型的情况是复制到上传用户的HDFS home目录下,比如/home/wyp/),然后再将数据从那个临时目录下移动(注意,这里说的是移动,不是复制!)到对应的Hive表的数据目录里面。既然如此,那么Hive肯定支持将数据直接从HDFS上的一个目录移动到相应Hive表的数据目录下,假设有下面这个文件/home/wyp/add.txt,具体的操作如下:
hive>load data inpath '/home/wyp/add.txt' into table wyp;
和方式一的区别是没有local这个单词的。
3) 从别的表中查询出相应的数据并导入到hive表中;
hive>insert into table test
>partition(age='25')
>select id ,name from wyp;
hive>insert overwrite table test
>partition(age)
>select id ,name from wyp;
这种方法叫做动态分区插入,但是Hive中默认是关闭的,所以在使用前需要先把hive.exec.dynamic.partition.mode设置为nonstrict。当然,Hive也支持insert overwrite方式来插入数据,从字面我们就可以看出,overwrite是覆盖的意思,是的,执行完这条语句的时候,相应数据目录下的数据将会被覆盖!而insert into则不会,注意两者之间的区别。更可喜的是,Hive还支持多表插入,什么意思呢?在Hive中,我们可以把insert语句倒过来,把from放在最前面,它的执行效果和放在后面是一样的,如下:
hive>from wyp
>insert into table test
>partition(age)
>select id ,name
>insert into table test1
>partition(age)
>select id ,name
>where age>25;
4) 在创建表的时候通过从别的表中查询出相应的记录并插入到所创建的表中。
在实际情况中,表的输出结果可能太多,不适于显示在控制台上,这时候,将Hive的查询输出结果直接存在一个新的表中是非常方便的,我们称这种情况为CTAS(create table .. as select)如下:
hive>create table test4
>as
>select id,name from wyp;
Hive导出数据三种方式:
1) 导出到本地文件系统;
hive>insert overwrite local directory '/home/wyp/wyp'
>select * from wyp;
Hive0.11.0版本引进了一个新的特性,可以指定输出结果列之间的分隔符:
hive>insert overwrite local directory '/home/wyp/result
>row format delimited
>fields terminated by ' '
>select * from wyp;
2) 导出到hdfs;
hive>insert overwrite directory '/home/wyp/wyp'
>select * from wyp;
3) 导出到hive的另一个表中;
hive>insert into table test
>partition (age='25')
>select id,name from wyp;
其实,我们还可以用hive的-e和-f参数来导出数据。其中-e 表示后面直接接带双引号的sql语句;而-f是接一个文件,文件的内容为一个sql语句,如下:
#hive -e "select * from wyp" >> local/wyp.txt
# hive -f wyp.sql >> local/wyp2.txt