Wie schreibe ich eine Python-UDF für die benutzerdefinierte Aggregat-Funktion in Hive

Ich würde gerne eine Aggregationsarbeit an einer Aggregatspalte (nach GROUP BY) in Hive mit Python machen. Ich fand dort UDAF zu diesem Zweck. Alles was ich finde, ist ein Java-Beispiel. Gibt es ein Beispiel für das Schreiben in Python?

Oder für python zwischen UDF und UDAF gibt es keinen Unterschied? Für UDAF muss ich es nur wie ein Reduzierer schreiben? Bitte beraten.

    2 Solutions collect form web for “Wie schreibe ich eine Python-UDF für die benutzerdefinierte Aggregat-Funktion in Hive”

    Sie können von Hive's Streaming UDF-Funktionalität (TRANSFORM) nutzen, um eine Python-UDF zu verwenden, die von stdin und Ausgängen zu stdout liest. Sie haben keine Python "UDAF" Beispiele gefunden, weil UDAF bezieht sich auf die Hive Java-Klasse Sie verlängern, so wäre es nur in Java.

    Bei der Verwendung einer Streaming-UDF wird Hive wählen, ob sie starten oder eine Karte oder einen Job reduzieren müssen, also gibt es keine Notwendigkeit zu spezifizieren (für mehr über diese Funktionalität siehe diesen Link: https://cwiki.apache.org/confluence/display/Hive / LanguageManual + Transform ).

    Grundsätzlich wäre deine Implementierung ein Python-Skript zu schreiben, das aus stdin liest, eine ganze Zahl berechnet und es an stdout ausgibt. Um in Hive zu implementieren, gehen Sie wie folgt vor:

    1) Zuerst füge dein Python-Skript deiner Ressource-Bibliothek in Hive hinzu, damit es über deinen Cluster verteilt wird:

    add file script.py; 

    2) Dann rufen Sie Ihre Transformationsfunktion an und geben Sie die Spalten ein, die Sie aggregieren möchten. Hier ist ein Beispiel:

     select transform(input cols) using 'python script.py' as (output cols) from table ; 

    Je nachdem, was Sie tun müssen, benötigen Sie möglicherweise einen separaten Mapper und Reduzierer Skript. Wenn Sie auf der Grundlage des Spaltenwerts aggregieren müssen, denken Sie daran, Hive's CLUSTER BY / DISTRIBUTE BY Syntax in Ihrer Mapperstufe zu verwenden, damit partitionierte Daten an den Reduzierer gesendet werden.

    Lassen Sie mich wissen, ob das hilft.

    Wenn ich die Antwort von Michael erweitere, schrieb ich einen Blogpost zu diesem Thema, der auch berücksichtigt, dass du externe Bibliotheken verwenden möchtest, die du zusätzlich zu deinem Python-Skript bereitstellen musst.

    Du findest meinen Blog

    Python ist die beste Programmiersprache der Welt.