失败:语义异常 [错误 10014]:第 1:21 行错误的参数“stock_price_high”:

Posted

技术标签:

【中文标题】失败:语义异常 [错误 10014]:第 1:21 行错误的参数“stock_price_high”:【英文标题】:FAILED: SemanticException [Error 10014]: Line 1:21 Wrong arguments 'stock_price_high': 【发布时间】:2017-11-27 22:14:20 【问题描述】:

我是 Hive 的新手,我正在尝试在 Hive 命令行中创建和使用 UDF。

我创建了一个 Java 代码来根据样本 NYSE 数据集计算股票的协方差。下面是Java代码:

package udf;

import org.apache.hadoop.hive.ql.exec.UDF;

public class CoVariance extends UDF 
    public Double covariance (Double stockpricex, Double stockpricey, Double avgstockpricex, Double avgstockpricey, int tuplecount) 

        if (stockpricex == null|| stockpricey == null || avgstockpricex == null || avgstockpricey == null || tuplecount == 0 ) 
        return null;
         //check for invalid parameters

        Double covar = ((stockpricex-avgstockpricex)*(stockpricey-avgstockpricey)/(tuplecount - 1));

        return covar.doubleValue();     
     // return the final co-variance of the stocks

 // end of class

将 jar 文件添加到 hive shell 后,我创建了一个名为 'cv' 的临时函数并传递参数。

select stock_symbol, cv(stock_price_high, stock_price_low, avg(stock_price_high), avg(stock_price_low), count(stock_price_high)) from nyse group by stock_symbol, stock_price_high, stock_price_low;

我收到以下错误:

失败:SemanticException [错误 10014]:第 1:21 行参数错误 'stock_price_high':类 udf.CoVariance 没有匹配方法 (双,双,双,双,大整数)。可能的选择:

这里出了什么问题?您的帮助将不胜感激。

【问题讨论】:

【参考方案1】:

不清楚您如何注册 UDF,但 JavaDoc 说明了这一点

扩展此 UDF 的所有类的要求是: - 实现一个或多个名为 evaluate 的方法,这些方法将被 Hive 调用

你的方法covariance应该重命名为evaluate

根据 Hive 错误,int tuplecount 应该是 longBigInteger

【讨论】:

hive.apache.org/javadocs/r1.2.2/api/org/apache/hadoop/hive/ql/… 还有很多关于 Java UDF 的博客。我所看到的都提到了这种方法 谢谢,我将通过该链接并尝试在 UDF 上查找博客。【参考方案2】:

感谢您指出这一点,我认为我们可以定义自己的函数,但似乎我们必须使用该预定义函数。如果您可以参考您所参考的 JavaDoc 帮助页面,那将非常有帮助。

根据您的建议,我对代码进行了以下更改,现在我可以从 Hive Shell 调用此 UDF。但它返回的结果是 Infinity 的计算。

我尝试将 'tuplecount' 的数据类型更改为 long 和 double,但仍然导致同样的问题。

QXM QTM 2 无限

package customudf;

import org.apache.hadoop.hive.ql.exec.UDF;


public class CoVariance extends UDF 
    public Double evaluate (double stockpricex, double stockpricey, double avgstockpricex, double avgstockpricey, double tuplecount) 

        Double result = null;

        if (stockpricex == 0|| stockpricey == 0 || avgstockpricex == 0 || avgstockpricey == 0 || tuplecount == 0 ) 
        return null;
         //check for invalid parameters

        else 
        tuplecount --;  

        result = ((stockpricex-avgstockpricex)*(stockpricey-avgstockpricey)/(tuplecount));

        return result.doubleValue();

        
     // return the final co-variance of the stocks

 // end of class

【讨论】:

有什么建议吗?

以上是关于失败:语义异常 [错误 10014]:第 1:21 行错误的参数“stock_price_high”:的主要内容,如果未能解决你的问题,请参考以下文章

setsockopt 返回错误 10014

Hive 给出 SemanticException [错误 10014]:运行我的 UDF 时

hive 脚本由于堆空间问题而失败,无法处理太多分区

Winsock 连接失败并显示 WSAEFAULT |仅在 Windows 11 上出现错误

网络异常下载失败是啥原因

请求的操作无法执行、语义不正确或业务验证失败