与 Hive UDFs/UDAFs/UDTFs 的集成
描述
Spark SQL支持Hive UDF、UDAF和UDTF的集成。与Spark UDF和UDAF类似,Hive UDF以单行作为输入并生成单行作为输出,而Hive UDAF在多行上操作并返回单个聚合行作为结果。此外,Hive还支持UDTF(用户定义的表格函数),它以单行作为输入并返回多行作为输出。要使用Hive UDF/UDAF/UTF,用户应在Spark中注册它们,然后在Spark SQL查询中使用它们。
示例
Hive有两个UDF接口:
UDF
和
GenericUDF
。下面的示例使用从
GenericUDF
派生的
GenericUDFAbs
。
-- 注册 `GenericUDFAbs` 并在 Spark SQL 中使用它。
-- 请注意,如果您使用自己编写的函数,需要将包含该函数的 JAR 添加到类路径中,
-- 例如,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|
+--------------+
-- 注册 `UDFSubstr` 并在 Spark SQL 中使用它。
-- 请注意,如果返回类型和方法参数使用 Java 原始类型,可以实现更好的性能。
-- 例如,UDFSubstr。数据处理方法是 UTF8String <-> Text <-> String。我们可以避免 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 。
-- 注册 `GenericUDTFExplode` 并在 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 接口:
UDAF
和
GenericUDAFResolver
。下面的示例使用
GenericUDAFSum
,它派生自
GenericUDAFResolver
。
-- 注册 `GenericUDAFSum` 并在 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|
+---+---------------+