2013-10-06 173 views
2

我有它的列由^ A和「\ n」換行字符分隔行分隔的文件。HIVE分隔符 n^M的問題

我第一次上傳到HDFS,然後在蜂巢使用命令這樣創建表:

CREATE EXTERNAL TABLE 
IF NOT EXISTS 
html_sample 
(ts string, 
    url string, 
    html string) 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '\001' 
LINES TERMINATED BY '\n' 
LOCATION '/tmp/directoryname/'; 

然而,當我對這個表做了select語句。結果是一團糟。

表看起來是這樣的:

ts    url     html 
10082013  http://url.com/01  <doctype>.....style="padding-top: 10px; 
text-align... NULL     NULL 
text-align... NULL     NULL 
text-align... NULL     NULL 
10092013  http://url.com/02  <doctype>.....style="padding-top: 10px; 
text-align... NULL     NULL 
text-align... NULL     NULL 
text-align... NULL     NULL 

然後我又回到了文本文件,並找到該文件,這使得HIVE治療是^ M作爲新行字符存在幾個^ M字符。

當我第一次創建的文件,我特意刪除了所有的換行字符從HTML,以保證每條記錄是一行。但是,我不明白HIVE如何能將^ M當作換行符。我怎樣才能解決這個問題,而無需修改我的文件。

(我知道有可能做全局替換在VI或sed的...但它只是沒有那麼多有道理的,我怎麼可能HIVE治療^ M爲\ n)的

回答

5

^M是Vim顯示Windows行尾的方式。 這裏有更多關於這個: What does ^M character mean in Vim?

而且蜂巢反過來使用的TextInputFormat碰巧把它當作一個有效行終止。

根據Hadoop和配置單元的版本,你使用可以有不同的方法來解決這個(從改變配置屬性自定義InputFormat實現)。

只要找到一種方式來明確指定分隔符。

,是的,合同終止BY「\ n」行沒有做什麼樣子。 我使用蜂巢0.11和唯一可能的值實際上是「\ n」的,但它沒有提升到的TextInputFormat

+2

下面是來自Hadoop的一票與解決的TextInputFormat問題。也許這將是對你有所幫助,同時尋找一個具體的解決方案https://issues.apache.org/jira/browse/MAPREDUCE-2254 – ybodnar

+1

感謝您的回答,我周圍使用SED -e「S/^ M // g'刪除我的文件中所有現有的^ M,並且似乎工作。但修改配置文件肯定是一個長期的解決方案。 –