通过 jdbc 客户端使用 hive udf 时出现奇怪的错误

Posted

技术标签:

【中文标题】通过 jdbc 客户端使用 hive udf 时出现奇怪的错误【英文标题】:Strange error when use hive udf through jdbc client 【发布时间】:2012-12-28 08:34:23 【问题描述】:

全部。我通过 jdbc 客户端使用 hive udf 时遇到了一个奇怪的错误。

我有一个 udf 可以帮助我将字符串转换为时间戳格式,名为 reformat_date。我首先执行ADD JARCREATE TEMPORARY FUNCTION,都可以正常工作。

SQL也可以在hive cli模式下解释,并且可以执行。但是当使用jdbc客户端时,我得到了错误:

    Query returned non-zero code: 10, cause: 
    FAILED: Error in semantic analysis: Line 1:283 Wrong arguments ''20121201000000'': 
    org.apache.hadoop.hive.ql.metadata.HiveException: 
    Unable to execute method public org.apache.hadoop.io.Text com.aa.datawarehouse.hive.udf.ReformatDate.evaluate(org.apache.hadoop.io.Text)  on object com.aa.datawarehouse.hive.udf.ReformatDate@4557e3e8 of class com.aa.datawarehouse.hive.udf.ReformatDate with arguments 20121201000000:org.apache.hadoop.io.Text of size 1: 
    at com.aa.statistic.dal.impl.TjLoginDalImpl.selectAwakenedUserCount(TjLoginDalImpl.java:258)
    at com.aa.statistic.backtask.service.impl.UserBehaviorAnalysisServiceImpl.recordAwakenedUser(UserBehaviorAnalysisServiceImpl.java:326)
    at com.aa.statistic.backtask.controller.BackstatisticController$21.execute(BackstatisticController.java:773)
    at com.aa.statistic.backtask.controller.BackstatisticController$DailyExecutor.execute(BackstatisticController.java:823)

我的 SQL 是

select count(distinct a.user_id) as cnt from ( select user_id, user_kind, login_date, login_time from tj_login_hive where p_month = '2012_12' and login_date = '20121201' and user_kind = '0' ) a join ( select user_id from tj_login_hive where p_month <= '2012_12' and datediff(to_date(reformat_date(concat('20121201', '000000'))), to_date(reformat_date(concat(login_date, '000000')))) >= 90 ) b on a.user_id = b.user_id 

谢谢。

【问题讨论】:

【参考方案1】:

我认为您的 udf 引发了异常。 如果 reformat_date 函数是你做的,你应该检查你的逻辑。 如果没有,您应该检查 udf 的规范。

【讨论】:

reformat_date 是我的 udf。我可以在hive shell中使用它,但是我不能通过java JDBC客户端使用它。

以上是关于通过 jdbc 客户端使用 hive udf 时出现奇怪的错误的主要内容,如果未能解决你的问题,请参考以下文章

在 HIVE 中运行 UDF 以进行自定义反序列化时出现 OWN_TASK_FAILURE。

编写Spark的UDF函数解决Hive表大数bigintdoublefloatdecimal等转字符串string时出现的科学计数法问题Java

编写Spark的UDF函数解决Hive表大数bigintdoublefloatdecimal等转字符串string时出现的科学计数法问题Java

在 Hortonworks 上使用 Jdbc 远程连接到 Hive 时出现 ClassNotFoundException

Hive如何在源码中添加自定义UDF?

1Java通过JDBC操作Hive