Integration in Hive-UDFs, -UDAFs und -UDTFs

Gilt für:Häkchen 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|
+---+---------------+