Hive RegexSerDe 没有给出正确的输出

Posted

技术标签:

【中文标题】Hive RegexSerDe 没有给出正确的输出【英文标题】:Hive RegexSerDe not giving the correct output 【发布时间】:2014-12-01 10:12:29 【问题描述】:

我正在输入具有数据的文本文件

0000856214AB25 256 T PL1423AS

2563458547CD12 748 S AK2523YU

在正则表达式查询下方使用以获取输出

hive> CREATE TABLE test_regex(
>f1 STRING,f2 STRING,
>f3 STRING,f4 STRING,
>f5 STRING,f6 STRING,
>f7 STRING) ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe' 
>WITH SERDEPROPERTIES ("input.regex" = 
>"([0-9]10)([A-Z]2)([0-9]2)\\s+([0-9]3)\\s+([A-Z]1)\\s+([A-Z]2)([A-Z0-9]6)",
>"output.format.string" = "%1$s %2$s %3$s %4$s %5s %6s %7s")
>STORED AS TEXTFILE;

输出:

hive> select *from test_regex;

0000856214  AB  25  256 T   PL  1423AS

2563458547  CD  12  748 S   AK  2523YU

但是当我尝试使用以下查询获取输出时

Query: Select f1 from test_regex;
or     Select f1,f3,f5 from test_regex;

输出:错误

失败:执行错误,从 org.apache.hadoop.hive.ql.exec.mr.MapRedTask 返回代码 2

` . . 有人可以帮我解决上述问题吗?

提前致谢。

【问题讨论】:

请发布完整的错误信息。 将整个错误分为 3 个部分。 总 MapReduce 作业 = 1 正在启动作业 1 / 1 由于没有 reduce 操作符,reduce 任务数设置为 0 开始作业 = job_201410131439_0291,跟踪 URL = masterhost.localdomain:50030/jobdetail s.jsp?jobid=job_201410131439_0291 终止命令 = /usr /lib/hadoop/bin/hadoop job -kill job_201410131439_0291 Stage-1的Hadoop作业信息:映射器数量:1;减速器数量:0 2014-12-01 19:25:08,109 Stage-1 map =0%, reduce = 0% 2014-12-01 19:26:01,107 Stage-1 map = 100%, reduce = 100% 结束Job = job_201410131439_0291 有错误 作业期间出错,正在获取调试信息... 作业跟踪 URL:masterhost.localdomain:50030/… 检查任务 ID:task_201410131439_0291_m_000002(以及更多)来自作业 job_201410131439_0291 失败次数最多的任务 (4):- ---- 任务 ID:task_201410131439_0291_m_000000 URL:localhost:50030/… ----- 此任务的诊断消息:java.lang.RuntimeException:在 org.apache.hadoop.util.ReflectionUtils.setJobConf 配置对象时出错 (ReflectionUtils.java:75) 在 org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:133) 在 org.apache.hadoop.mapred.MapTask.runOldMapper( MapTask.java:413) 在 org.apache.hadoop.mapred.MapTask.run(MapTask.java:332) 在 org.apache.hadoop.mapred.Child$4.run(Child.java:268) 在 java.security。 AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:415) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1548) at org.apache.hadoop.mapred.Child.main(Child.java:262) 引起:java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native方法)在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.ja 失败:执行错误,从 org.apache.hadoop.hive.ql.exec 返回代码 2。 mr.MapRedTask MapReduce 作业启动:作业 0:地图:1 HDFS 读取:0 HDFS 写入:0 FAIL MapReduce CPU 总时间花费:0 毫秒您能否检查并帮助谢谢 【参考方案1】:

这不是真正的错误,以下是如何找到它: 转到 hadoop jobtracker web-dashboard,找到失败的 hive mapreduce 作业并查看失败任务的日志。这会告诉你真正的错误。

或 在 tmp/user/hive.log 中查看日志

由未找到 org.apache.hadoop.hive.contrib.serde2.RegexSerDe 引起

转到http://www.java2s.com/Code/Jar/h/Downloadhivecontrib081jar.htm

download jar hive-contrib-0.8.1.jar

然后在hive中,根据你的系统路径添加jar

 ADD JAR /home/user17/hive/hive-contrib-0.8.1.jar

select f1 from test_regex; 

输出

0000856214
2563458547

【讨论】:

我可以在“/usr/lib/hive/lib”路径下看到 hive-contrib jar 文件。这是我正在寻找的正确道路吗?我接下来该怎么办?? 然后在 hive 终端上执行这个命令。添加 JAR /usr/lib/hive/lib/hive-contrib-0.8.1.jar 嗨@Kishore 如何在使用上述查询获得如下结果后添加 25 和 12? 0000856214 AB 25 256 T PL 1423AS 2563458547 CD 12 748 S AK 2523YU 谢谢,帕拉什 我没有收到您的查询,您是要单行还是要添加 25 和 12? 我想在上面提到的查询中添加 25 和 12,它被定义为字符串。那么我们需要转换它还是我们可以直接做呢?

以上是关于Hive RegexSerDe 没有给出正确的输出的主要内容,如果未能解决你的问题,请参考以下文章

Syslog 数据的 Hive 表

为啥 QDatastream 没有给出正确的输出

NORMDIST 函数没有给出正确的输出

Scapy ARP函数在运行时没有给出正确的输出

当没有列增加时,PIVOT 给出不正确的输出

使用大数字时背包没有给出正确的输出