Hive中的三种不同的数据导出方式介绍

来源:互联网 发布:时时彩合买软件 编辑:程序博客网 时间:2024/06/06 00:14
问题导读:
1.导出本地文件系统和hdfs文件系统区别是什么?
2.带有local命令是指导出本地还是hdfs文件系统?
3.hive中,使用的insert与传统数据库insert的区别是什么?
4.导出数据如何自定义分隔符?





今天我们再谈谈Hive中的三种不同的数据导出方式。
根据导出的地方不一样,将这些方式分为三种:
(1)、导出到本地文件系统;
(2)、导出到HDFS中;
(3)、导出到Hive的另一个表中。
为了避免单纯的文字,我将一步一步地用命令进行说明。


一、导出到本地文件系统

  1.   
  2. hive> insert overwrite local directory '/home/wyp/wyp'
  3.     > select * from wyp;
复制代码

这条HQL的执行需要启用Mapreduce完成,运行完这条语句之后,将会在本地文件系统的/home/wyp/wyp目录下生成文件,这个文件是Reduce产生的结果(这里生成的文件名是000000_0),我们可以看看这个文件的内容:

  1. [wyp@master ~/wyp]$ vim 000000_0
  2. 5^Awyp1^A23^A131212121212
  3. 6^Awyp2^A24^A134535353535
  4. 7^Awyp3^A25^A132453535353
  5. 8^Awyp4^A26^A154243434355
  6. 1^Awyp^A25^A13188888888888
  7. 2^Atest^A30^A13888888888888
  8. 3^Azs^A34^A899314121
复制代码

可以看出,这就是wyp表中的所有数据。数据中的列与列之间的分隔符是^A(ascii码是\00001)。

和导入数据到Hive不一样,不能用insert into来将数据导出:

  1.   
  2. hive> insert into local directory '/home/wyp/wyp'
  3.     > select * from wyp;
  4. NoViableAltException(79@[])
  5.         at org.apache.hadoop.hive.ql.parse.HiveParser_SelectClauseParser.selectClause(HiveParser_SelectClauseParser.java:683)
  6.         at org.apache.hadoop.hive.ql.parse.HiveParser.selectClause(HiveParser.java:30667)
  7.         at org.apache.hadoop.hive.ql.parse.HiveParser.regular_body(HiveParser.java:28421)
  8.         at org.apache.hadoop.hive.ql.parse.HiveParser.queryStatement(HiveParser.java:28306)
  9.         at org.apache.hadoop.hive.ql.parse.HiveParser.queryStatementExpression(HiveParser.java:28100)
  10.         at org.apache.hadoop.hive.ql.parse.HiveParser.execStatement(HiveParser.java:1213)
  11.         at org.apache.hadoop.hive.ql.parse.HiveParser.statement(HiveParser.java:928)
  12.         at org.apache.hadoop.hive.ql.parse.ParseDriver.parse(ParseDriver.java:190)
  13.         at org.apache.hadoop.hive.ql.Driver.compile(Driver.java:418)
  14.         at org.apache.hadoop.hive.ql.Driver.compile(Driver.java:337)
  15.         at org.apache.hadoop.hive.ql.Driver.run(Driver.java:902)
  16.         at org.apache.hadoop.hive.cli.CliDriver.processLocalCmd(CliDriver.java:259)
  17.         at org.apache.hadoop.hive.cli.CliDriver.processCmd(CliDriver.java:216)
  18.         at org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:413)
  19.         at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:756)
  20.         at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:614)
  21.         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  22.         at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
  23.         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
  24.         at java.lang.reflect.Method.invoke(Method.java:597)
  25.         at org.apache.hadoop.util.RunJar.main(RunJar.java:212)
  26. FAILED: ParseException line 1:12 missing TABLE at 'local' near 'local' in select clause
  27. line 1:18 cannot recognize input near 'directory' ''/home/wyp/wyp'' 'select' in select clause
复制代码

二、导出到HDFS中
和导入数据到本地文件系统一样的简单,可以用下面的语句实现:

  1.   
  2. hive> insert overwrite directory '/home/wyp/hdfs'
  3.     > select * from wyp;
复制代码
将会在HDFS的/home/wyp/hdfs目录下保存导出来的数据。注意,和导出文件到本地文件系统的HQL少一个local,数据的存放路径就不一样了。

三、导出到Hive的另一个表中

这也是Hive的数据导入方式,如下操作:

  1.  
  2. hive> insert into table test
  3.     > partition (age='25')
  4.     > select id, name, tel
  5.     > from wyp;
  6. #####################################################################
  7.            这里输出了一堆Mapreduce任务信息,这里省略
  8. #####################################################################
  9. Total MapReduce CPU Time Spent: 1 seconds 310 msec
  10. OK
  11. Time taken: 19.125 seconds

  12. hive> select * from test;
  13. OK
  14. 5       wyp1    131212121212    25
  15. 6       wyp2    134535353535    25
  16. 7       wyp3    132453535353    25
  17. 8       wyp4    154243434355    25
  18. 1       wyp     13188888888888  25
  19. 2       test    13888888888888  25
  20. 3       zs      899314121       25
  21. Time taken: 0.126 seconds, Fetched: 7 row(s)
复制代码

细心的读者可能会问,怎么导入数据到文件中,数据的列之间为什么不是wyp表设定的列分隔符呢?其实在Hive 0.11.0版本之间,数据的导出是不能指定列之间的分隔符的,只能用默认的列分隔符,也就是上面的^A来分割,这样导出来的数据很不直观,看起来很不方便!
如果你用的Hive版本是0.11.0,那么你可以在导出数据的时候来指定列之间的分隔符。

下面详细介绍:


在Hive0.11.0版本新引进了一个新的特性,也就是当用户将Hive查询结果输出到文件,用户可以指定列的分割符,而在之前的版本是不能指定列之间的分隔符,这样给我们带来了很大的不变,在Hive0.11.0之前版本我们一般是这样用的:
  1. hive> insert overwrite local directory '/home/wyp/Documents/result'
  2. hive> select * from test;
复制代码
保存的文件列之间是用^A(\x01)来分割
  1. 196^A242^A3
  2. 186^A302^A3
  3. 22^A377^A1
  4. 244^A51^A2
复制代码
注意,上面是为了显示方便,而将\x01写作^A,在实际的文本编辑器我们是看不到^A的,而是一个奇怪的符号。
现在我们可以用Hive0.11.0版本新引进了一个新的特性,指定输出结果列之间的分隔符:
  1. hive> insert overwrite local directory '/home/wyp/Documents/result'
  2. hive> row format delimited
  3. hive> fields terminated by '\t'
  4. hive> select * from test;
复制代码
再次看出输出的结果
  1. 196        242        3
  2. 186        302        3
  3. 22        377        1
  4. 244        51        2
复制代码

结果好看多了。如果是map类型可以用下面语句来分割map的key和value
  1. hive> insert overwrite local directory './test-04' 
  2. hive> row format delimited 
  3. hive> FIELDS TERMINATED BY '\t'
  4. hive> COLLECTION ITEMS TERMINATED BY ','
  5. hive> MAP KEYS TERMINATED BY ':'
  6. hive> select * from src;
复制代码



根据上面内容,我们来进一步操作:


  1. hive> insert overwrite local directory '/home/yangping.wu/local'
  2.     > row format delimited
  3.     > fields terminated by '\t'
  4.     > select * from wyp;
复制代码
  1. [wyp@master ~/local]$ vim 000000_0
  2. 5       wyp1    23      131212121212
  3. 6       wyp2    24      134535353535
  4. 7       wyp3    25      132453535353
  5. 8       wyp4    26      154243434355
  6. 1       wyp     25      13188888888888
  7. 2       test    30      13888888888888
  8. 3       zs      34      899314121
复制代码

其实,我们还可以用hive的-e和-f参数来导出数据。其中-e 表示后面直接接带双引号的sql语句;而-f是接一个文件,文件的内容为一个sql语句,如下:

  1.   
  2. [wyp@master ~/local][        DISCUZ_CODE_26        ]nbsp; hive -e "select * from wyp" >> local/wyp.txt
  3. [wyp@master ~/local][        DISCUZ_CODE_26        ]nbsp; cat wyp.txt
  4. 5       wyp1    23      131212121212
  5. 6       wyp2    24      134535353535
  6. 7       wyp3    25      132453535353
  7. 8       wyp4    26      154243434355
  8. 1       wyp     25      13188888888888
  9. 2       test    30      13888888888888
  10. 3       zs      34      899314121
复制代码
得到的结果也是用\t分割的。也可以用-f参数实现:

  1. [wyp@master ~/local]$ cat wyp.sql
  2. select * from wyp
  3. [wyp@master ~/local]$ hive -f wyp.sql >> local/wyp2.txt
复制代码

上述语句得到的结果也是\t分割的。
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 木家具生黑虫子怎么办 吃了发霉的面包怎么办 种的韭菜有蛆怎么办 活狗身上长蛆虫怎么办 狗身上会有蛆虫怎么办 狗身上长满了蛆怎么办 房间墙上有很多小虫子怎么办 床上有许多小虫子怎么办? 店里有许多小虫子怎么办 房间潮湿有很多小虫子怎么办 家里潮湿墙上发霉长小虫怎么办? 房间有小飞虫子怎么办 狗被灭虫剂喷了怎么办 吃鸡玩久了手机屏幕很涩怎么办 超东卧室太阳晒怎么办 床头上的布破了怎么办 老年机全静音了怎么办 老年机手机不亮怎么办 70岁老人耳朵聋怎么办 血压太低了头晕怎么办 血压高忽然变低怎么办 血压高眼睛红了怎么办 高血压200降不下去.怎么办 高血压吃药降不下来怎么办 合肥房子卖了户口怎么办 吃了粽子胃难受怎么办 突然血压高怎么办需要吃药吗? 胃一阵阵疼然后拉肚子怎么办 橱子和墙壁不平怎么办 复印选项是英文不认识怎么办 防盗门锁与门框结合不好怎么办 仿瓷涂料墙壁脏了怎么办 油笔画到墙纸上怎么办 水笔画在墙纸上怎么办 屋里有股石灰味怎么办 厨房太阳对着晒怎么办 房子有太阳西斜怎么办 房子晒到太阳很热怎么办 房子被太阳热了怎么办 房间西晒窗帘不遮光怎么办 新建房屋一面墙体有裂缝怎么办