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, вместе с которым его нельзя указывать.

  • function_name

    Имя функции. Имя функции может быть дополнено именем схемы.

    Функции, созданные в 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