创建函数
描述
该
CREATE FUNCTION
语句用于在Spark中创建临时或永久函数。临时函数的作用域是会话级别,而永久函数是在持久目录中创建的,供所有会话使用。在第一次执行时,
USING
子句中指定的资源对所有执行器可用。除了SQL接口外,Spark允许用户使用Scala、Python和Java API创建自定义用户定义的标量和聚合函数。有关更多信息,请参见
标量UDFs
和
UDAFs
。
语法
创建 [ 或 替换 ] [ 临时 ] 函数 [ 如果 不存在 则 ]
function_name 作为 class_name [ resource_locations ]
参数
-
或替换
如果指定,则重新加载函数的资源。这主要用于获取对函数实现所做的任何更改。此参数与
IF NOT EXISTS
是互斥的,不能一起指定。 -
临时
指示正在创建的函数的范围。当指定
TEMPORARY
时,创建的函数在当前会话中有效且可见。这类函数在目录中没有持久性条目。 -
如果不存在
如果指定,则仅在函数不存在时创建该函数。如果指定的函数在系统中已经存在,则函数的创建成功(不会抛出错误)。此参数与
OR REPLACE
是互斥的,不能一起指定。 -
函数名称
指定要创建的函数的名称。函数名称可以选择性地使用数据库名称来限定。
语法:
[ database_name. ] function_name
-
类名称
指定提供要创建的函数实现的类的名称。实现类应扩展以下基类之一:
-
应扩展
UDF
或UDAF
,位于org.apache.hadoop.hive.ql.exec
包中。 -
应扩展
AbstractGenericUDAFResolver
、GenericUDF
或GenericUDTF
,位于org.apache.hadoop.hive.ql.udf.generic
包中。 -
应扩展
UserDefinedAggregateFunction
,位于org.apache.spark.sql.expressions
包中。
-
应扩展
-
资源位置
指定包含函数实现及其依赖项的资源列表。
语法:
USING { { (JAR | FILE | ARCHIVE) resource_uri } , ... }
示例
-- 1. 创建一个简单的 UDF `SimpleUdf`,将提供的整数值增加 10。
-- import org.apache.hadoop.hive.ql.exec.UDF;
-- public class SimpleUdf extends UDF {
-- public int evaluate(int value) {
-- return value + 10;
-- }
-- }
-- 2. 编译并将其放入一个名为 `SimpleUdf.jar` 的 JAR 文件中,路径为 /tmp。
-- 创建一个名为 `test` 的表并插入两行数据。
CREATE TABLE test(c1 INT);
INSERT INTO test VALUES (1), (2);
-- 创建一个永久函数,名为 `simple_udf`。
CREATE FUNCTION simple_udf AS 'SimpleUdf'
USING JAR '/tmp/SimpleUdf.jar';
-- 验证该函数是否在注册表中。
SHOW USER FUNCTIONS;
+------------------+
| function|
+------------------+
|default.simple_udf|
+------------------+
-- 调用该函数。每个选定的值应增加 10。
SELECT simple_udf(c1) AS function_return_value FROM test;
+---------------------+
|function_return_value|
+---------------------+
| 11|
| 12|
+---------------------+
-- 创建一个临时函数。
CREATE TEMPORARY FUNCTION simple_temp_udf AS 'SimpleUdf'
USING JAR '/tmp/SimpleUdf.jar';
-- 验证新创建的临时函数是否在注册表中。
-- 请注意,临时函数没有与之关联的合格
-- 数据库。
SHOW USER FUNCTIONS;
+------------------+
| function|
+------------------+
|default.simple_udf|
| simple_temp_udf|
+------------------+
-- 1. 修改 `SimpleUdf` 的实现,将提供的整数值增加 20。
-- import org.apache.hadoop.hive.ql.exec.UDF;
-- public class SimpleUdfR extends UDF {
-- public int evaluate(int value) {
-- return value + 20;
-- }
-- }
-- 2. 编译并将其放入一个名为 `SimpleUdfR.jar` 的 JAR 文件中,路径为 /tmp。
-- 替换 `simple_udf` 的实现
CREATE OR REPLACE FUNCTION simple_udf AS 'SimpleUdfR'
USING JAR '/tmp/SimpleUdfR.jar';
-- 调用该函数。每个选定的值应增加 20。
SELECT simple_udf(c1) AS function_return_value FROM test;
+---------------------+
|function_return_value|
+---------------------+
| 21|
| 22|
+---------------------+