转自:http://blog.chinaunix.net/uid-27177626-id-4653808.html
Hive三种不同的数据导出的方式,根据导出的地方不一样,将这些方法分为三类:
(1)导出到本地文件系统
(2)导出到HDFS
(3)导出到hive的另一个表中
导出到本地文件系统
执行:
hive> insert overwrite local directory '/root/student'
> select * from student;
通过insert overwrite local directory将hive中的表student的内容倒到本地文件系统的/root下的student目录下,这条HQL的执行需要启用Mapreduce完成,运行完这条语句之后,将会在本地文件系统的/root/student目录下生成文件,这个文件是Reduce产生的结果(这里生成的文件名是000000_0),我们可以看看这个文件的内容:
可以看出这就是表student中的数据,数据之间用空格间隔开来。
注:将数据从hive倒到本地文件系统与将数据倒到hive不一样,不能用insert into实现。
导出到HDFS
将hive中的数据导出到HDFS和将数据导出到本地文件系统类似,只是命令的执行中少了一个“local”
可以查看hdfs的对应目录,发现数据确实倒入了指定目录。
将数据导出到hive的另一张表
即:hive> insert into table hive_student_test
> select id,name,sex,salary
> from student;
前提是在hive中创建好目标表hive_student_test,然后执行上述操作将hive中的student表的数据依据其id,name,sex,salary字段将其导入到目标表中。查询目标表的结果:
在hive0.11.0版本中新引进了一个新的特性,也就是当用户将hive查询结果输出到文件,用户可以只用列的分隔符,而在之前的版本中是不能指定列之间的分隔符的。例如:
hive> insert overwrite local directory '/root/student'
> row format delimited
> fields terminated by '\t'
> select * from student;
还可以用hive的-e和-f参数来导出数据,其中-e表示后面直接带双引号的sql语句;而-f是接一个文件,文件的内容为一个sql语句。如下所示:
执行:./hive -e "select * from student" >> /root/student11.txt
这个得到的结果也是用\t分割的。也可以用-f实现。
执行:./hive -f /root/SQL.sql >> /root/student12.txt