Hive insert into directory 命令輸出的文件沒有列分隔符分析和解決


參考資料: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/';

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM