Partager via


Intégration avec les fonctions UDF, UDAF et UDTF Hive

S’applique à : coche marquée oui Databricks Runtime

Spark SQL prend en charge l’intégration aux fonctions UDF, UDAFs et UDTF Hive. Comme les fonctions UDF et les UDAF Spark, les UDF Hive s’utilisent sur une seule ligne en entrée et génèrent une seule ligne en sortie, tandis que les UDAF Hive opèrent sur plusieurs lignes et renvoient une seule ligne agrégée comme résultat. En outre, Hive prend également en charge les fonctions UDTF (User Defined Tabular Functions) qui agissent sur une ligne comme entrée et retournent plusieurs lignes en sortie. Pour utiliser les fonctions UDF/UDAF/UTF Hive, l'utilisateur doit les inscrire dans Spark, puis les utiliser dans des requêtes Spark SQL.

Exemples

Hive possède deux interfaces UDF : UDF et GenericUDF. L'exemple ci-dessous utilise GenericUDFAbs dérivé de GenericUDF.

-- 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|
+--------------+

L'exemple ci-dessous utilise GenericUDTFExplode dérivé de GenericUDTF.

-- 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 possède deux interfaces UDAF : UDAF et GenericUDAFResolver. L'exemple ci-dessous utilise GenericUDAFSum dérivé de GenericUDAFResolver.

-- 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|
+---+---------------+