簡體   English   中英

失敗:SemanticException [錯誤10014]:行1:21錯誤的參數'stock_price_high':

[英]FAILED: SemanticException [Error 10014]: Line 1:21 Wrong arguments 'stock_price_high':

我是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文件添加到配置單元外殼后,我創建了一個名為“ 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的(雙,雙,雙,雙,雙,bigint)沒有匹配方法。 可能的選擇:

這是怎么了? 您的幫助將不勝感激。

不清楚如何注冊UDF,但JavaDoc表示

擴展此UDF的所有類的要求是:
-實現一個或多個名為evaluate方法,該方法將由Hive調用

您的方法covariance應重命名evaluate

根據Hive錯誤, int tuplecount應該為longBigInteger

感謝您指出這一點,我認為我們可以定義自己的函數,但是似乎我們必須使用該預定義的函數。 如果您可以參考所參考的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM