首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >配置单元RegexSerDe为空

配置单元RegexSerDe为空
EN

Stack Overflow用户
提问于 2012-08-03 22:04:30
回答 1查看 1.4K关注 0票数 1

我应该如何在RegexSerDe中使用空值?我有包含数据的文件:

代码语言:javascript
复制
cat MOS/ex1.txt

123,dwdjwhdjwh,456

543,\N,956

我有一张桌子:

代码语言:javascript
复制
CREATE TABLE mos.stations (usaf string, wban STRING, name string)
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
    "input.regex" = "(.*),(.*),(.*)"
);

我成功地将数据从文件加载到表中:

代码语言:javascript
复制
LOAD DATA LOCAL INPATH '/home/hduser/MOS/ex1.txt' OVERWRITE INTO TABLE mos.stations;

简单的select可以很好地工作:

代码语言:javascript
复制
hive> select * from mos.stations;

123dwdjwhdjwh456

543\N956

下一步以错误结束:

代码语言:javascript
复制
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

怎么啦?

EN

回答 1

Stack Overflow用户

发布于 2012-08-04 01:03:01

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

1)它可能与null处理没有任何关系。第一个查询实际上不会产生M/R作业,而第二个查询会产生,因此这可能是一个简单的类路径问题,其中M/R任务看不到RegexSerde,因为它的jar不在任务跟踪器的类路径中。您需要找到系统上的hive-contrib jar所在的位置,然后通过如下方式让hive意识到它:

代码语言:javascript
复制
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一样。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11797305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档