赞
踩
不知道大家有没有遇到过这个问题:
hive建表,指定字段分隔符为制表符’\t’,然后在windows上按照hive表格式写好的文件,上传到linux服务器,之后利用hadoop fs -put命令将文件上传至hdfs,之后去hive表中查询数据,发现全部都是NULL!喵喵喵???
直接上图:
1. 建表:
2. 准备数据(在linux下直接vim创建文件,然后输入内容),下面是显示的文件:
3. 将数据上传到hdfs上:
4. 在hive client窗口中查询数据:
喵喵喵???Execuse me ???
我是直接在linux系统下通过vim创建的文件,然后输入的内容,制表符 ‘\t’也是直接摁的键盘上的 Tab 键啊!我擦嘞,为啥hive就不认这个 ‘\t’ 呢?
我一直以为,只要是所有的操作都在linux系统下执行,就会被linux完全认同的,后来我通过一些方法校验了之后,我发现自己太年轻了……
好了,不扯皮了,我下面列出我的校验过程吧:
1. 既然hive表不认识我编写的文件中的 \t 制表符,也就是说我在vim 窗口下直接输入制表符(摁键盘上的Tab键是有问题的),那我就使用 \t 符号吧:
2. 使用cat -A命令分别查看temp1.txt文件和test.txt文件中内容的区别:
咦,这还真是不同哈!!!我的天呐~
看来在vim窗口直接输入制表符和将 \t 输入到文件中,最后文件中的保存方式是不一样的,下面是ASCII码表中对制表符的说明:
很奇怪吧,我没搞懂……
3. 将test.txt文件上传到hdfs,并查询数据:
搞定!!!
现在知道原因了,程序是可以向文件中输入 \t 的,但是如果我就是自己的数据文件,自己要输入 \t 的话,那可怎么办呢?
下面是我从网上查的:
1. 在vim编辑窗口,先执行命令:set list(命令意思自己查)
2. Ctrl+V,然后点击Tab键:
大家可以看出来了吧,出现了 ^I 符号,这个才能被hive识别为 \t 键。
之后再输入自己的内容即可。
另外呢,我记得我之前有时候在Windows文本编辑器上直接编辑时,摁 Tab 键直接输入的制表符,上传到linux,再到hdfs,是可以直接被hive识别的,可是现在就不行了,不知道为啥……
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。