Share via


Hive UDF、UDAF、UDTF との統合

適用対象:「はい」のチェック マーク Databricks Runtime

Spark SQL では、Hive UDF、UDAF、および UDTF の統合がサポートされています。 Spark UDF および UDAF と同様に、Hive UDF は単一の行に対して入力として機能し、出力として単一の行を生成します。一方、Hive UDAF は複数の行に作用し、結果として単一の集計行を返します。 また、Hive では UDTF (ユーザー定義の表形式関数) もサポートされています。これは、1 つの行に対して入力として動作し、出力として複数の行を返します。 Hive UDF、UDAF、UDTF を使用するには、ユーザーはそれらを Spark に登録してから、Spark SQL クエリで使用する必要があります。

Hive には、UDFGenericUDF という 2 つの UDF インターフェイスがあります。 次の例では、GenericUDF から派生した 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|
+--------------+

次の例では、GenericUDTF から派生した 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 には、UDAFGenericUDAFResolver という 2 つの UDAF インターフェイスがあります。 次の例では、GenericUDAFResolver から派生した 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|
+---+---------------+