2016-07-20 30 views
1

Es gibt eine UDF Java-Klasse wie folgt:Warum Text wird bevorzugt als String in Hive UDF Java-Klasse

import org.apache.commons.lang.StringUtils; 
import org.apache.hadoop.hive.ql.exec.UDF; 
import org.apache.hadoop.io.Text; 

public class Strip extends UDF { 
    private Text result = new Text(); 

    public Text evaluate(Text str) { 
    if (str == null) { 
    return null; 
    } 
    result.set(StringUtils.strip(str.toString())); 
    return result; 
} 

public Text evaluate(Text str, String stripChars) { 
    if (str == null) { 
    return null; 
    } 
    result.set(StringUtils.strip(str.toString(), stripChars)); 
    return result; 
} 
} 

Hive tatsächlich unterstützt Java Primitiven in SEF (und einige andere Arten, wie zum Beispiel Java. util.List und java.util.Map), so eine Signatur wie:

public String evaluate(String str) 

würde genauso gut funktionieren. Durch die Verwendung von Text können wir jedoch die Wiederverwendung von Objekten nutzen, , was zu Effizienzeinsparungen führen kann, so dass dies im Allgemeinen bevorzugt wird. Kann mir jemand den Grund nennen, warum Text bevorzugt wird? Warum könnten wir die Wiederverwendung von Objekten mithilfe von Text nutzen? Wenn wir den folgenden Befehl in Hive ausführen:

hive> SELECT strip(' bee ') FROM dummy; 

Danach führen wir einen weiteren Befehl, dass Streifen Funktion, dann wird der Streifen Objekt wieder erstellt wird, nicht wahr? Also können wir es nicht wiederverwenden, oder?

+0

Schauen Sie sich die http://stackoverflow.com/questions/19851665 – leftjoin

+0

Text wandelbar ist, können Sie neuen Wert gesetzt, Objekt Wiederverwendung – leftjoin

Antwort

0

Sie können eine Textinstanz wiederverwenden, indem Sie eine der set() -Methoden aufrufen. Zum Beispiel:

Text t = new Text("hadoop"); 
t.set("pig"); 
+0

Sie meinen, der Text wandelbar ist, aber der String ist nicht, so wir können es wiederverwenden, oder? Wenn wir es in einer Tabellenspalte verwenden, können wir auf diese Weise die Auswertung verwenden, um viele Zeilen zu verarbeiten, aber das Ergebnis wird nur einmal erstellt, das Streifenobjekt wird auch einmal erstellt, richtig? – Coinnigh