Bagikan melalui


Integrasi dengan Apache Hive UDFs, UDAFs, dan UDTFs

Berlaku untuk:centang ditandai ya Databricks Runtime

Spark SQL mendukung integrasi Hive UDFs, UDAFs, dan UDTFs. Mirip dengan Spark UDF dan UDAF, Hive UDF bekerja pada satu baris sebagai input dan menghasilkan satu baris sebagai output, sementara Hive UDAF beroperasi pada beberapa baris dan mengembalikan satu baris agregat sebagai hasilnya. Selain itu, Hive juga mendukung UDTF (User Defined Tabular Functions) yang bertindak pada satu baris sebagai input dan mengembalikan beberapa baris sebagai output. Untuk menggunakan Hive UDF/UDAF/UTF, pengguna harus mendaftarkannya di Spark, lalu menggunakannya di kueri Spark SQL.

Contoh

Hive memiliki dua antarmuka UDF: UDF dan GenericUDF. Contoh di bawah ini menggunakan GenericUDFAbs berasal dari 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|
+--------------+

Contoh di bawah ini menggunakan GenericUDTFExplode yang berasal dari 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 memiliki dua antarmuka UDAF: UDAF dan GenericUDAFResolver. Contoh di bawah ini menggunakan GenericUDAFSum yang berasal dari 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|
+---+---------------+