失败:语义异常 [错误 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
应该是 long
或 BigInteger
【讨论】:
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”:的主要内容,如果未能解决你的问题,请参考以下文章
Hive 给出 SemanticException [错误 10014]:运行我的 UDF 时