hive运行UDF函数报错Hive Runtime Error while processing row。

发布于 2022-09-12 02:45:46 字数 5515 浏览 16 评论 0

第一次来贵站提问,还请各位老师多多指导

  • 描述大致的实现过程:
    我想要实现字段码值的标准化,有的系统“女”用“M”表示,有的用“2”表示,那么现在要统一为用“1”表示,这样实现码值的标准、统一。

hive库中已存在一张标准的码表,现有8行数据:
类别 源系统码值 标准码值
sex F 1
sex 2 1
把这张表的性别和源系统码值拼接,转化为key,标准码值转化为value,形成HashMap

源系统存在一张表,现有4行数据:
类型1 源系统码值 类别2 源系统码值
sex 1 goods 苹果
sex 2 goods 香蕉
sex F goods 桃子

定义UDF函数,定义两个输入变量input1,input2,input1表示类别,用户运行UDF函数时,直接写死;input2表示源系统表中的源码值字段,两者拼接成key,然后传入上述的HashMap找出他的value

  • 在hive中运行udf:
    udf打成jar包,然后在hive中配置成功udf函数,在hive中运行
    select udfname(“sex”, 源系统码值) from 源表
  • 运行hive查询时报错
    在公司的cdh5.x环境和自己搭建的集群跑都报错

Error: java.lang.RuntimeException: org.apache.hadoop.hive.ql.metadata.HiveException: Hive Runtime Error while processing row {"sex":"1","srcode":"未知","goods":"1","srcode2":"西瓜"}

at org.apache.hadoop.hive.ql.exec.mr.ExecMapper.map(ExecMapper.java:179)
at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:54)
at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:459)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:343)
at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:164)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1920)
at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)

Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: Hive Runtime Error while processing row {"sex":"1","srcode":"未知","goods":"1","srcode2":"西瓜"}

at org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:507)
at org.apache.hadoop.hive.ql.exec.mr.ExecMapper.map(ExecMapper.java:170)
... 8 more

Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: Unable to execute method public java.lang.String com.pagoda.TsCode.evaluate(java.lang.String,java.lang.String) throws java.lang.Exception on object com.pagoda.TsCode@46cb98a3 of class com.pagoda.TsCode with arguments {sex:java.lang.String, 1:java.lang.String} of size 2

at org.apache.hadoop.hive.ql.exec.FunctionRegistry.invoke(FunctionRegistry.java:993)
at org.apache.hadoop.hive.ql.udf.generic.GenericUDFBridge.evaluate(GenericUDFBridge.java:182)
at org.apache.hadoop.hive.ql.exec.ExprNodeGenericFuncEvaluator._evaluate(ExprNodeGenericFuncEvaluator.java:186)
at org.apache.hadoop.hive.ql.exec.ExprNodeEvaluator.evaluate(ExprNodeEvaluator.java:77)
at org.apache.hadoop.hive.ql.exec.ExprNodeEvaluator.evaluate(ExprNodeEvaluator.java:65)
at org.apache.hadoop.hive.ql.exec.SelectOperator.processOp(SelectOperator.java:77)
at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:815)
at org.apache.hadoop.hive.ql.exec.TableScanOperator.processOp(TableScanOperator.java:98)
at org.apache.hadoop.hive.ql.exec.MapOperator$MapOpCtx.forward(MapOperator.java:157)
at org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:497)
... 9 more

Caused by: java.lang.reflect.InvocationTargetException

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.hadoop.hive.ql.exec.FunctionRegistry.invoke(FunctionRegistry.java:969)
... 18 more

Caused by: java.sql.SQLException: Could not open client transport with JDBC Uri: jdbc:hive2://10.8.31.42:10000/test/;principal=hive/master2-dev.pagoda.com.cn@PAGODA.COM.DEV: GSS initiate failed

at org.apache.hive.jdbc.HiveConnection.openTransport(HiveConnection.java:232)
at org.apache.hive.jdbc.HiveConnection.<init>(HiveConnection.java:169)
at org.apache.hive.jdbc.HiveDriver.connect(HiveDriver.java:105)
at java.sql.DriverManager.getConnection(DriverManager.java:664)
at java.sql.DriverManager.getConnection(DriverManager.java:270)
at com.pagoda.TsCode.sqlMap(TsCode.java:77)
at com.pagoda.TsCode.evaluate(TsCode.java:117)
... 23 more

Caused by: org.apache.thrift.transport.TTransportException: GSS initiate failed

at org.apache.thrift.transport.TSaslTransport.sendAndThrowMessage(TSaslTransport.java:232)
at org.apache.thrift.transport.TSaslTransport.open(TSaslTransport.java:316)
at org.apache.thrift.transport.TSaslClientTransport.open(TSaslClientTransport.java:37)
at org.apache.hadoop.hive.thrift.client.TUGIAssumingTransport$1.run(TUGIAssumingTransport.java:52)
at org.apache.hadoop.hive.thrift.client.TUGIAssumingTransport$1.run(TUGIAssumingTransport.java:49)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1920)
at org.apache.hadoop.hive.thrift.client.TUGIAssumingTransport.open(TUGIAssumingTransport.java:49)
at org.apache.hive.jdbc.HiveConnection.openTransport(HiveConnection.java:204)
... 29 more

百度到的处理方式:
set hive.vectorized.execution.enabled=false; 控制是否启用查询执行的向量模式。这种方法尝试过无效

其他问题
1、这种码字的转化也可以直接使用几个表join,但是我们绝的表多很麻烦,想采用udf尝试
2、为什么会map100%,reduce就0%呢?而且如果这个hive语句不通过mapreduce跑是可以得出想要的结果(hive-site.xml中将hive.fetch.task.conversion 设为more表示简单查询不走map/reduce)
,感觉就在这块出现问题,但是自己不太对mapreduce的机制也不太熟悉。

因此想请教下各位老师帮忙看看

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文