2016-04-05 5 views
0

Wir haben eine Hive UDF in Java geschrieben haben Wert aus einer Datei zu holen in verteilten Cache hinzugefügt, die wie perfekt aus einer Auswahlabfrage funktioniert:Hive UDF Wert von verteilten Cache holen nicht mit äußeren Abfragen arbeiten

Abfrage 1.

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

Aber funktioniert nicht beim Versuch, Tabelle von seiner Ausgabe zu erstellen. Wie:

Abfrage 2.

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

Es wird nicht einmal von den äußeren wählen zu arbeiten. Wie:

Abfrage 3.

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

Unten ist mein UDF bewerten Funktion:

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"; 
    } 
} 

Hinzufügen von Glas, Datei und Erstellen von Hive temporäre Funktion in Hive wie:

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

Wenn ich Abfrage 1 ausführe, bekomme ich den erwarteten Wert von Map, aber wenn ich Abfrage 2 und 3 starte, bekomme ich 'NA'. Als ich Map.size() für Abfrage 2 und 3 anstelle von 'NA' zurückgab, war es Null.

Ich bin verwirrt, warum äußere select oder create table ist nicht in der Lage, coutryMap() Wert zu holen und warum die Größe von Map wird Null.

Antwort

0

Welche Version von Hive verwenden Sie? Vor 0.14.0 hattest du set hive.cache.expr.evaluation = false; um a bug zu umgehen.

Verwandte Themen