我应该如何使用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
有什么问题?
答案 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一样好。