Hive UDF/UDAF/UDTF との統合

説明

Spark SQL は Hive UDF、UDAF、UDTF の統合をサポートしています。Spark UDF と UDAF と同様に、Hive UDF は入力を 1 行として扱って出力を 1 行として生成し、一方 Hive UDAF は複数の行を操作して、集約された 1 行の結果を返します。さらに、Hive は、1 行の入力を操作して複数の行の出力を返す UDTF (ユーザー定義テーブル関数) もサポートしています。Hive UDF/UDAF/UTF を使用するには、ユーザはそれらを Spark に登録し、それらを Spark SQL クエリで使用します。

Hive には 2 つの UDF インターフェイス: UDFGenericUDF があります。以下の例は 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|
+--------------+

-- Register `UDFSubstr` and use it in Spark SQL.
-- Note that, it can achieve better performance if the return types and method parameters use Java primitives.
-- e.g., UDFSubstr. The data processing method is UTF8String <-> Text <-> String. we can avoid UTF8String <-> Text. 
CREATE TEMPORARY FUNCTION hive_substr AS 'org.apache.hadoop.hive.ql.udf.UDFSubstr';

select hive_substr('Spark SQL', 1, 5) as value;
+-----+
|value|
+-----+
|Spark|
+-----+

以下の例は GenericUDTFExplodeGenericUDTF から派生して使用しています。

-- 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 には 2 つの UDAF インターフェイス: UDFGenericUDAFResolver があります。以下の例は 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|
+---+---------------+