Integrasi dengan UDF Apache Hive, UDAF, dan UDTF

Berlaku untuk:check ditandai ya Databricks Runtime

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

Contoh

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

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