Hive insert into directory 命令输出的文件没有列分隔符分析和解决
2015-05-18 21:09
399 查看
参考资料:http://stackoverflow.com/questions/16459790/hive-insert-overwrite-directory-command-output-is-not-separated-by-a-delimiter
问题描述:
Hive insert into directory 命令输出的文件没有指定列分隔符,输出结果就像变成了一个字符串。
通过CREATE EXTERNAL TABLE 和load 方式,尝试了多种分隔符都不能正确的区分,所有的字段内容合起来变成一个字符串放在了第一个字段,而后面的字段全部为NULL。
问题分析:
1. 导出前的Hive表是以'\t'作为分隔符的,用hadoop fs -cat 看到数据是有分隔符的,如:
2. 导出语句如下:
3. 查看导出的文件内容:
hadoop dfs -cat /tmp/hdfs_out/000000_0
解决方法:
引文中的满意答案如下:
意思是,在没有指定分隔符的默认情况下,hive用'\1' 来做列分隔符,因此,对于这样的文件,要用'\001'来区分。
据此,将建表语句改为后装载成功:
问题描述:
Hive insert into directory 命令输出的文件没有指定列分隔符,输出结果就像变成了一个字符串。
通过CREATE EXTERNAL TABLE 和load 方式,尝试了多种分隔符都不能正确的区分,所有的字段内容合起来变成一个字符串放在了第一个字段,而后面的字段全部为NULL。
问题分析:
1. 导出前的Hive表是以'\t'作为分隔符的,用hadoop fs -cat 看到数据是有分隔符的,如:
001 000 001 000 002 001 003 002 004 003 005 004 006 005 007 006 008 007 099 007
2. 导出语句如下:
insert overwrite directory '/tmp/hdfs_out' select a.* from invites a where a.ds='<date>';
3. 查看导出的文件内容:
hadoop dfs -cat /tmp/hdfs_out/000000_0
001000 001000 002001 003002 004003 005004 006005 007006 008007 099007
解决方法:
引文中的满意答案如下:
Are you sure there is no delimiter in the output directory? By default, Hive uses '\1' for the field delimiter, so you should try `hadoop dfs -cat "/tmp/hdfs_out/*" | tr '\001' ' ' – libjack May 9 '13 at 17:11
意思是,在没有指定分隔符的默认情况下,hive用'\1' 来做列分隔符,因此,对于这样的文件,要用'\001'来区分。
据此,将建表语句改为后装载成功:
CREATE EXTERNAL TABLE tmp_06_table_name( …… ) COMMENT 'this is tmp_06_table_name' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\1' STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 'hdfs://yncm/tmp/hdfs_out/';
相关文章推荐
- log4j日志文件:解决只有控制台输出没有文件输出的问题!
- gdb print 输出写到文件里 --- tee 命令可以解决
- 解决 Python.h:没有那个文件或目录 错误的方法( Python.h:No such file or directory )
- 写一个程序,能够动态生成多条插入语句如:insert into MyStudents values(“人名1”,年龄,‘男’,分数1,分数2)。将生成的插入语句输出到记事本文件 SQLStr.txt中
- 动态生成多条插入语句如:insert into MyStudents values(“人名1”,年龄,‘男’,分数1,分数2)。将生成的插入语句输出到记事本文件 SQLStr.txt中
- 动态生成多条插入语句如:insert into MyStudents values(“人名1”,年龄,‘男’,分数1,分数2)。将生成的插入语句输出到记事本文件 SQLStr.txt中
- 动态生成多条插入语句如:insert into MyStudents values(“人名1”,年龄,‘男’,分数1,分数2)。将生成的插入语句输出到记事本文件 SQLStr.txt中
- java调用unix命令没有输出的解决
- 执行文件下载Java 调用 FFMPEG 命令时用 url 作为输入源,Linux 下出现 “no such file or directory” 问题的解决
- [添加用户]解决useradd 用户后没有添加用户Home目录的情况,Linux改变文件或目录的访问权限命令,linux修改用户密码
- [添加用户]解决useradd 用户后没有添加用户Home目录的情况,Linux改变文件或目录的访问权限命令,linux修改用户密码,usermod的ysuum安装包。飞
- git diff 文件没有任何输出的解决方法
- Linux系统怎样识别没有扩展名的文件类型? 用file命令解决
- 将指定目录指定类型文件以指定分隔符组合文件名不换行输出到指定文件命令
- MySQL数据库服务器逐渐变慢分析与解决(6)vmstat命令输出的六个部分
- 解决useradd 用户后没有添加用户Home目录的情况,Linux改变文件或目录的访问权限命令,linux修改用户密码
- Xcode 写代码没有补全提示解决:删缓存及显示隐藏文件命令
- Hive在spark2.0.0启动时无法访问../lib/spark-assembly-*.jar: 没有那个文件或目录的解决办法
- (六)编译安装zabbix3.4.4执行make报致命错误:event.h没有这个文件解决+分析方法
- shell命令:以空格为分隔符截取文件每行的第一个字符串,并用sort排序,再去掉相同的字符串,将结果输出到另一个文件