2012-08-03 35 views
1

我應該如何在RegexSerDe中使用NULL值? 我有文件與數據:配置單元RegexSerDe null

cat MOS/ex1.txt 

123,dwdjwhdjwh,456 

543,\N,956 

我有表:

CREATE TABLE mos.stations (usaf string, wban STRING, name string) 
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe' 
WITH SERDEPROPERTIES (
    "input.regex" = "(.*),(.*),(.*)" 
); 

我成功加載了數據從文件表:

LOAD DATA LOCAL INPATH '/home/hduser/MOS/ex1.txt' OVERWRITE INTO TABLE mos.stations; 

簡單的選擇優良工程:

hive> select * from mos.stations; 

123dwdjwhdjwh456 

543\N956 

而下一個錯誤結束:

select * from mos.stations where wban is null; 
[Hive Error]: Query returned non-zero code: 9, cause: FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.MapRedTask 

出了什麼問題?

回答

1

我看到一對夫婦的可能的問題:

1)它可能沒有什麼關係的空值處理的。第一個查詢實際上並不產生M/R作業,而第二個查詢不會產生M/R作業,因此它可能是一個簡單的類路徑問題,其中RegexSerde沒有被M/R任務看到,因爲它的jar不在tasktracker的類路徑中。你將需要找到您的系統上的蜂房的contrib罐子住,然後讓蜂巢意識到這一點通過這樣的:

add jar /usr/lib/hive/lib/hive-contrib-0.7.1-cdh3u2.jar 

注意,你的路徑和jar名稱可能不同。您可以在查詢之前通過配置單元運行上述操作。

2)另一個問題可能是RegexSerde並沒有像默認的LazySimpleSerde一樣處理「\ N」。根據你在第一個查詢中獲得的輸出(它返回一個文字「\ N」)來判斷,可能是這種情況。如果查詢where wban='\\N',會發生什麼情況?或where wban='\N'(我忘了你是否需要加倍逃脫)。

最後,有一句關於RegexSerde的警告。雖然它非常方便,但它在一月份與默認的serde相比上漲速度很慢。如果數據集很大,並且您計劃針對該數據集運行很多查詢,則最好進行預處理,以便不需要RegexSerde。否則,你會爲每個查詢付罰款。上面的相同數據集看起來對於默認的serde可能沒問題。