1

我应该如何在 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

怎么了?

4

1 回答 1

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 名称可能不同。您可以在查询之前通过 hive 运行上述内容。

2) 另一个问题可能是 RegexSerde 并没有像默认的 LazySimpleSerde 那样真正处理“\N”。从您在第一个查询中获得的输出来看(它返回一个文字“\ N”),可能就是这种情况。如果查询会发生什么where wban='\\N'?或where wban='\N'(我忘记了您是否需要双重转义)。

最后,请注意 RegexSerde。虽然它真的很方便,但与默认的 serde 相比,它在一月份的糖蜜上坡速度很慢。如果数据集很大并且您计划对其运行大量查询,最好进行预处理,这样您就不需要 RegexSerde。否则,您将为每次查询支付罚款。上面相同的数据集看起来使用默认的 serde 就可以了。

于 2012-08-03T17:03:01.310 回答