Integration in Hive-UDFs, -UDAFs und -UDTFs
Gilt für: Databricks Runtime
Spark SQL unterstützt die Integration von Hive-UDFs, -UDAFs und -UDTFs. Ähnlich wie Spark-UDFs und -UDAFs arbeiten Hive-UDFs mit einer einzelnen Zeile als Eingabe und generieren eine einzelne Zeile als Ausgabe, während Hive-UDAFs mit mehreren Zeilen arbeiten und eine einzelne aggregierte Zeile als Ergebnis zurückgeben. Darüber hinaus unterstützt Hive auch UDTFs (User Defined Tabular Functions, benutzerdefinierte Tabellenfunktionen), die auf eine Zeile als Eingabe angewendet werden und mehrere Zeilen als Ausgabe zurückgeben. Um Hive-UDFs/-UDAFs/-UTFs verwenden zu können, muss der Benutzer sie in Spark registrieren und dann in Spark SQL-Abfragen verwenden.
Beispiele
Hive bietet zwei UDF-Schnittstellen: UDF und GenericUDF.
Das folgende Beispiel verwendet von GenericUDF
abgeleitetes GenericUDFAbs.
-- Register `GenericUDFAbs` and use it in Spark SQL.
-- Note that, if you use your own programmed one, you need to add a JAR containing it
-- into a classpath,
-- e.g., ADD JAR yourHiveUDF.jar;
CREATE TEMPORARY FUNCTION testUDF AS 'org.apache.hadoop.hive.ql.udf.generic.GenericUDFAbs';
SELECT * FROM t;
+-----+
|value|
+-----+
| -1.0|
| 2.0|
| -3.0|
+-----+
SELECT testUDF(value) FROM t;
+--------------+
|testUDF(value)|
+--------------+
| 1.0|
| 2.0|
| 3.0|
+--------------+
Das folgende Beispiel verwendet von GenericUDTF abgeleitetes GenericUDTFExplode.
-- Register `GenericUDTFExplode` and use it in Spark SQL
CREATE TEMPORARY FUNCTION hiveUDTF
AS 'org.apache.hadoop.hive.ql.udf.generic.GenericUDTFExplode';
SELECT * FROM t;
+------+
| value|
+------+
|[1, 2]|
|[3, 4]|
+------+
SELECT hiveUDTF(value) FROM t;
+---+
|col|
+---+
| 1|
| 2|
| 3|
| 4|
+---+
Hive verfügt über zwei UDAF-Schnittstellen: UDAF und GenericUDAFResolver.
Das folgende Beispiel verwendet von GenericUDAFResolver
abgeleitetes GenericUDAFSum.
-- Register `GenericUDAFSum` and use it in Spark SQL
CREATE TEMPORARY FUNCTION hiveUDAF
AS 'org.apache.hadoop.hive.ql.udf.generic.GenericUDAFSum';
SELECT * FROM t;
+---+-----+
|key|value|
+---+-----+
| a| 1|
| a| 2|
| b| 3|
+---+-----+
SELECT key, hiveUDAF(value) FROM t GROUP BY key;
+---+---------------+
|key|hiveUDAF(value)|
+---+---------------+
| b| 3|
| a| 3|
+---+---------------+