Dela via


Integrering med Hive UDF, UDAF och UDTF

Gäller för: markerad ja Databricks Runtime

Spark SQL stöder integrering av Hive UDF:er, UDF:er och UDF:er. På samma sätt som Spark-UDF:er och UDAF:er fungerar Hive-UDF:er på en enda rad som indata och genererar en enskild rad som utdata, medan Hive UDAFs fungerar på flera rader och returnerar en enda aggregerad rad som ett resultat. Dessutom har Hive även stöd för UDF:er (användardefinierade tabellfunktioner) som fungerar på en rad som indata och returnerar flera rader som utdata. Om du vill använda Hive UDF:er/UDF:er/UDF:er bör användaren registrera dem i Spark och sedan använda dem i Spark SQL-frågor.

Exempel

Hive har två UDF-gränssnitt: UDF och GenericUDF. Ett exempel nedan använder GenericUDFAbs som härletts från 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|
+--------------+

I ett exempel nedan används GenericUDTFExplode som härletts från 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 har två UDAF-gränssnitt: UDAF och GenericUDAFResolver. Ett exempel nedan använder GenericUDAFSum som härletts från 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|
+---+---------------+