Hive UDF/UDAF/UDTF との統合
説明
Spark SQL は、Hive UDF、UDAF、および UDTF との統合をサポートしています。Spark UDF および UDAF と同様に、Hive UDF は単一行を入力として受け取り、単一行を出力として生成します。一方、Hive UDAF は複数行を操作し、集計された単一行を結果として返します。さらに、Hive は UDTF (User Defined Tabular Functions) もサポートしており、これは一行を入力として受け取り、複数行を出力として返します。Hive UDF/UDAF/UDTF を使用するには、ユーザーは Spark にそれらを登録してから、Spark SQL クエリで使用する必要があります。
例
Hive には UDF インターフェイスが 2 つあります: UDF と GenericUDF。以下の例では、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|
+-----+
以下の例では、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 には UDAF インターフェイスが 2 つあります: UDAF と GenericUDAFResolver。以下の例では、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|
+---+---------------+