0

分散キャッシュに追加されたファイルから値をフェッチするために、Java で Hive UDF を作成しました。これは、次のような選択クエリから完全に機能します。

クエリ 1。

select country_key, MyFunction(country_key,"/data/MyData.txt") as capital from tablename;

ただし、出力からテーブルを作成しようとすると機能しません。お気に入り :

クエリ 2。

 create table new_table 
    as 
    select country_key, MyFunction(country_key,"/data/MyData.txt") as capital from tablename;

外側の選択からも機能していません。お気に入り :

クエリ 3。

select t.capital from 
(
select country_key, MyFunction(country_key,"/data/MyData.txt") as capital from tablename
) t;

以下は私のUDFの評価関数です:

public class CountryMap extends UDF{

    Map<Integer, String> countryMap =  null;

    public String evaluate(Integer keyCol, String mapFile) {


        if (countryMap == null){
            //read comma delimited data from mapFile and build a hashmap
                countryMap.put(key, value);
            }

        if (countryMap.containsKey(keyCol)) {
                return countryMap.get(keyCol);
            }
        return "NA";
    }
}

jar、file を追加し、Hive で Hive 一時関数を作成します。

ADD JAR /data/CountryMap-with-dependencies.jar;
ADD FILE /data/MyData.txt;
CREATE TEMPORARY FUNCTION MyFunction as 'CountryMap';

クエリ 1 を実行すると Map から期待値が得られますが、クエリ 2 と 3 を実行すると「NA」が得られます。「NA」の代わりにクエリ 2 と 3 の Map.size() を返したとき、それはゼロでした。

外部の select または create テーブルが coutryMap() 値をフェッチできない理由と、Map のサイズがゼロになる理由に困惑しています。

4

1 に答える 1

0

どのバージョンの Hive を使用していますか? 0.14.0 より前は、バグset hive.cache.expr.evaluation = false;を回避する必要がありました。

于 2016-12-06T22:42:08.203 に答える