參考資料: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 看到數據是有分隔符的,如:
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/';