2012-08-03 75 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可能没问题。