我应该如何在RegexSerDe中使用空值?我有包含数据的文件:
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;简单的select可以很好地工作:
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怎么啦?
发布于 2012-08-04 01:03:01
我看到了几个可能的问题:
1)它可能与null处理没有任何关系。第一个查询实际上不会产生M/R作业,而第二个查询会产生,因此这可能是一个简单的类路径问题,其中M/R任务看不到RegexSerde,因为它的jar不在任务跟踪器的类路径中。您需要找到系统上的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相比,它的速度很慢,就像1月份的糖蜜一样。如果数据集很大,并且您计划对其运行大量查询,则最好对其进行预处理,这样就不需要RegexSerde了。否则,您将为每个查询付出代价。上面的相同数据集看起来与默认serde一样。
https://stackoverflow.com/questions/11797305
复制相似问题