Hive的基本操作之数据导出

135 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。 ​

  •  将hive中的数据导出至Linux本地文件系统
hive>insert overwrite local directory '/root' select * from test_user_mutiple1;
#overwrite表示本地文件系统中该路径下如果有内容,会将该目录下的内容全部覆盖掉,而不是说路径下已经有该数据文件时才会覆盖原来的数据文件。

查看本地文件:

[root@hadoop01 ~]# cd /root
[root@hadoop01 ~]# ll
total 4
-rw-r--r-- 1 root root 54 Apr 22 07:04 000000_0
[root@hadoop01 ~]# cat 000000_0
1Tom
2Bob
3Lily
4Alice
1Tom
2Bob
3Lily
4Alice

导出前,本地文件系统/root目录:

 导出后:

测试证明,使用了overwrite参数会将你指定的这个目录下的所有内容全部覆盖掉!!! 而不是只有当与你要导出的数据文件已经存在时才会覆盖。

  •  hive将数据导出至hdfs文件系统中
hive> insert overwrite directory '/test0315/testfiledir' select * from test_user_mutiple1;

导出前:

 导出后:

 测试证明,数据导出至hdfs时使用overwrite参数也是会将该目录下的其他内容全部覆盖掉。

但是尝试把overwrite参数去掉再去导出数据时,发现报错了:

FAILED: ParseException line 1:7 cannot recognize input near 'insert' 'local' 'directory' in insert clause

后来还是加上overwrite之后才可以执行成功,所以初步认为overwrite在导出数据时是必须要加上的参数。因此我们在导出hive的数据时,尽量找一个空目录。

 要注意,数据导出时列与列之间默认是不分隔的。

所以在导出数据时我们可以指定导出的格式:

hive> insert overwrite local directory '/root/test0422' row format delimited fields terminated by ',' select * from test_user_mutiple1;

导出之后的文件:

  • 不使用hive交互界面,直接导出数据

这种方法可以直接在Linux上执行:

[root@hadoop01 test0422]# hive -e 'select * from test2.test_user_mutiple1' >> /root/test0422/0422;

#这里0422是要导出数据所存放的文件,也就是说数据导出后会放在这个文件中,这个文件不需要自己创建,会自动创建。
#由于是在hive之外执行命令的,所以它并不知道我们要使用的数据库是哪个库,所以这时就需要在表名前面指定库名,否则会报错,找不到该表。

使用这种方式导出来的文件数据是会帮我们把列与列之间进行分隔的。

以上就是hive中导出数据时可以使用的几种方式。