hive RegexSerDe null

时间:2012-08-03 14:04:30

标签: hive

我应该如何使用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 个答案:

答案 0 :(得分:1)

我看到了几个可能的问题:

1)它可能与null处理完全无关。第一个查询实际上不会产生M / R作业,而第二个查询会这样做,这可能是一个简单的类路径问题,其中M / R任务没有看到RegexSerde,因为它的jar不在tasktracker的类路径中。您需要找到系统中hive-contrib jar的位置,然后通过类似的方式让hive知道它:

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相比,它在1月份的糖蜜上升速度很慢。如果数据集很大并且您计划针对它运行大量查询,则最好进行预处理,以便您不需要RegexSerde。否则,您将为每个查询支付罚金。上面的相同数据集看起来与默认的serde一样好。