CREATE FUNCTION (внешняя)
Область применения: Databricks Runtime
Создает временную или постоянную внешнюю функцию. Временные функции существуют только в рамках текущего сеанса, тогда как постоянные функции сохраняются в каталоге и могут использоваться в последующих сеансах.
Ресурсы, указанные в предложении USING
, становятся доступными для всех исполнителей, когда они выполняются в первый раз.
В дополнение к возможностям интерфейса SQL в Spark можно создавать пользовательские скалярные и агрегатные функции с помощью API для Scala, Python и Java. Дополнительные сведения см. в статьях о внешних скалярных функциях (UDFs) и определяемых пользователем агрегатных функциях (UDAFs).
Синтаксис
CREATE [ OR REPLACE ] [ TEMPORARY ] FUNCTION [ IF NOT EXISTS ]
function_name AS class_name [ resource_locations ]
Параметры
OR REPLACE
Если этот параметр указан, происходит перезагрузка ресурсов для функции. Это в основном необходимо для выбора изменений, внесенных в реализацию функции. Этот параметр является взаимоисключающим с
IF NOT EXISTS
, вместе с которым его нельзя указывать.TEMPORARY
Указывает область создаваемой функции. Если указан параметр
TEMPORARY
, то созданная функция является допустимой и отображается в текущем сеансе. В каталог не вносится постоянная запись для функций такого типа.IF NOT EXISTS
Если этот параметр указан, функция создается только в том случае, если она не существует. Функция успешно создается (ошибки не возникает), если указанная функция уже существует в системе. Этот параметр является взаимоисключающим с
OR REPLACE
, вместе с которым его нельзя указывать.-
Имя функции. Имя функции может быть дополнено именем схемы.
Функции, созданные в
hive_metastore
ней, могут содержать только буквенно-цифровые символы ASCII и символы подчеркивания. class_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
.
resource_locations
Список ресурсов, содержащих реализацию функции вместе с ее зависимостями.
Синтаксис:
USING { { (JAR | FILE | ARCHIVE) resource_uri } , ... }
Примеры
-- 1. Create a simple UDF `SimpleUdf` that increments the supplied integral value by 10.
-- import org.apache.hadoop.hive.ql.exec.UDF;
-- public class SimpleUdf extends UDF {
-- public int evaluate(int value) {
-- return value + 10;
-- }
-- }
-- 2. Compile and place it in a JAR file called `SimpleUdf.jar` in /tmp.
-- Create a table called `test` and insert two rows.
> CREATE TABLE test(c1 INT);
> INSERT INTO test VALUES (1), (2);
-- Create a permanent function called `simple_udf`.
> CREATE FUNCTION simple_udf AS 'SimpleUdf'
USING JAR '/tmp/SimpleUdf.jar';
-- Verify that the function is in the registry.
> SHOW USER FUNCTIONS;
function
------------------
default.simple_udf
-- Invoke the function. Every selected value should be incremented by 10.
> SELECT simple_udf(c1) AS function_return_value FROM t1;
function_return_value
---------------------
11
12
-- Created a temporary function.
> CREATE TEMPORARY FUNCTION simple_temp_udf AS 'SimpleUdf'
USING JAR '/tmp/SimpleUdf.jar';
-- Verify that the newly created temporary function is in the registry.
-- The temporary function does not have a qualified
-- schema associated with it.
> SHOW USER FUNCTIONS;
function
------------------
default.simple_udf
simple_temp_udf
-- 1. Modify `SimpleUdf`'s implementation to add supplied integral value by 20.
-- import org.apache.hadoop.hive.ql.exec.UDF;
-- public class SimpleUdfR extends UDF {
-- public int evaluate(int value) {
-- return value + 20;
-- }
-- }
-- 2. Compile and place it in a jar file called `SimpleUdfR.jar` in /tmp.
-- Replace the implementation of `simple_udf`
> CREATE OR REPLACE FUNCTION simple_udf AS 'SimpleUdfR'
USING JAR '/tmp/SimpleUdfR.jar';
-- Invoke the function. Every selected value should be incremented by 20.
> SELECT simple_udf(c1) AS function_return_value FROM t1;
function_return_value
---------------------
21
22