CREATE FUNCTION(SQL, Python, Scala e Java)

Aplica-se a:marque sim SQL do Databricks marque sim Databricks Runtime

Cria uma função SQL escalar ou de tabela que aceita um conjunto de argumentos e retorna um valor escalar ou um conjunto de linhas.

Aplica-se a:marque sim SQL do Databricks marque sim LTS do Databricks Runtime 13.3 e superior

Cria uma função escalar do Python que usa um conjunto de argumentos e retorna um valor escalar.

Os UDFs Python requerem o Unity Catalog em armazéns sem servidor ou pro SQL, ou um recurso de computação habilitado para o Unity Catalog.

Aplica-se a:marque sim SQL do Databricks marque sim Databricks Runtime 14.1 e superior

Além da invocação de parâmetro posicional, você também pode invocar a UDF do SQL e do Python usando a invocação de parâmetro nomeado.

Aplica-se a:marca de seleção Sim Databricks SQL marca de seleção Sim Databricks Runtime 16.2 e versões superiores

Use a ENVIRONMENT cláusula para instalar dependências personalizadas e defina a versão do ambiente para uma função declarada com LANGUAGE PYTHON. Na computação clássica, um environment_version outro requer 'None' Databricks Runtime 18.2 ou superior.

Aplica-se a:verificação marcada como sim Databricks SQL verificação marcada como sim Databricks Runtime 16.3 e superior

Use PARAMETER STYLE PANDAS com a HANDLER cláusula para definir uma função em lote LANGUAGE PYTHON . O handler processa os dados de entrada como iteradores de pandas.Series objetos e gera pandas.Series objetos como saída.

Aplica-se a:check marked yes Databricks SQL check marked yes Databricks Runtime 18.1 and above

Use a HANDLER cláusula com uma função escalar LANGUAGE PYTHON linha a linha para nomear a função Python que lida com entradas UDF. Em computação serverless e em warehouses SQL pro e serverless, defina explicitamente os UDFs environment_version para 6 ou acima.

Aplica-se a:verificação marcada como sim Databricks SQL verificação marcada como sim Databricks Runtime 16.3 e superior

Use a CREDENTIALS cláusula para declarar credenciais de serviço do Unity Catalog que uma função escalar LANGUAGE PYTHON em lote ou linha a linha acessa. Veja Usar uma credencial de serviço em um UDF Python para requisitos de tipo de função, computação, ambiente e rede.

Aplica-se a:com marca de verificação sim Databricks SQL marcado sim Databricks Runtime 19 e acima

Use a SECRETS cláusula para declarar segredos do Unity Catalog que uma função escalar, batch LANGUAGE PYTHON ou uma função escalar LANGUAGE SCALA acessa. Veja requisitos e permissões do UDF para requisitos de computação, ambiente e permissões.

Aplica-se a:check marked yes Databricks SQL check marked yes Databricks Runtime 18.2 and above

Cria uma função escalar Scala ou Java que executa a lógica JVM compilada empacotada como um JAR. As UDFs scala e Java exigem o Catálogo do Unity. O suporte a SQL Warehouse é limitado a SQL Warehouses Pro e serverless. Você faz referência ao código compilado com a HANDLER cláusula e fornece o JAR por meio da ENVIRONMENT chave da java_dependencies cláusula. Para obter o fluxo de trabalho completo, incluindo como criar o JAR e registrar a função, consulte Scala e Java UDFs (funções definidas pelo usuário) no Catálogo do Unity.

Sintaxe

CREATE [OR REPLACE] [TEMPORARY] FUNCTION [IF NOT EXISTS]
    function_name ( [ function_parameter [, ...] ] )
    { [ RETURNS data_type ] |
      RETURNS TABLE [ ( column_spec [, ...]) ] }
    [ characteristic [...] ]
    { AS dollar_quoted_string | HANDLER handler_name [ AS dollar_quoted_string ] | RETURN { expression | query } }

function_parameter
    parameter_name data_type [DEFAULT default_expression] [COMMENT parameter_comment]

column_spec
    column_name data_type [COMMENT column_comment]

characteristic
  { LANGUAGE { SQL | PYTHON | SCALA | JAVA } |
    [NOT] DETERMINISTIC |
    COMMENT function_comment |
    [CONTAINS SQL | READS SQL DATA] |
    DEFAULT COLLATION default_collation_name |
    PARAMETER STYLE PANDAS |
    CREDENTIALS ( service_credential [, ...] ) |
    SECRETS ( secret_name [, ...] ) } |
    environment }

service_credential
    credential_name [ DEFAULT | AS credential_alias ]

secret_name
    catalog_name.schema_name.secret_name

environment
  ENVIRONMENT ( { environment_key = environment_value } [, ...] )

Parâmetros

  • OU SUBSTITUIR

    Se especificado, a função com o mesmo nome e assinatura (número e tipos de parâmetro) é substituída. Você não pode substituir uma função existente por uma assinatura ou um procedimento diferente. Isso é principalmente útil para atualizar o corpo e o tipo de retorno da função. Não é possível especificar esse parâmetro com IF NOT EXISTS.

  • TEMPORARY

    É o escopo da função que está sendo criada. Quando você especifica TEMPORARY, a função criada é válida e visível na sessão atual. Nenhuma entrada persistente é feita no catálogo.

  • SE NÃO EXISTIR

    Se especificado, cria a função somente quando ela não existir. A criação da função terá êxito (nenhum erro será gerado) se a função especificada já existir no sistema. Não é possível especificar esse parâmetro com OR REPLACE.

  • function_name

    Nome da função. Para uma função permanente, você pode qualificar o nome da função com um nome de esquema. Se o nome não for qualificado, a função permanente será criada no esquema atual.

    O nome da função deve ser exclusivo para todas as rotinas (procedimentos e funções) no esquema.

  • function_parameter

    Especifica um parâmetro da função.

    • parameter_name

      O nome do parâmetro deve ser exclusivo na função.

    • tipo_de_dado

      Qualquer tipo de dados com suporte. Para Python, data_type é convertido em um tipo de dados Python de acordo com esse mapeamento de linguagem.

      Para um STRINGdata_type, a ordenação padrão é a função default_collation_name.

    • PADRÃO default_expression

      Aplica-se a:marque sim SQL do Databricks marque sim LTS do Databricks Runtime 10.4 e superior

      Um padrão opcional a ser usado quando uma invocação de função não atribui um argumento ao parâmetro. default_expression deve ser conversível em data_type. A expressão não deve fazer referência a outro parâmetro nem conter uma subconsulta.

      Quando você especifica um padrão para um parâmetro, todos os parâmetros seguintes também devem ter um padrão.

      DEFAULT é compatível apenas com LANGUAGE SQL .

    • Comentário COMMENT

      Uma descrição opcional do parâmetro. comment deve ser uma literal de STRING.

  • RETORNA data_type

    O tipo de dados de retorno da função escalar. Para UDFs em Python, os valores de retorno devem corresponder ao .data_type

    Para a UDF do SQL, essa cláusula é opcional. O tipo de dado é derivado do corpo da função caso não seja fornecido.

  • RETURNS TABLE [ (especificação_de_coluna [,...] ) ]

    Essa cláusula marca a função como uma função de tabela. Opcionalmente, ele também especifica a assinatura do resultado da função de tabela. Se nenhuma column_spec for especificada, ela será derivada do corpo da UDF do SQL.

    RETURNS TABLE há suporte para LANGUAGE SQL e para LANGUAGE PYTHONUDTFs polimórficos (Databricks Runtime 18.1 e superior).

    • nome_da_coluna

      O nome da coluna deve ser exclusivo na assinatura.

    • tipo_de_dado

      Qualquer tipo de dados com suporte.

    • COMENTÁRIO column_comment

      Uma descrição opcional da coluna. comment deve ser uma literal de STRING.

  • RETURN { expressão | consulta }

    O corpo da função. Para uma função escalar, pode ser uma consulta ou expressão. Para uma função de tabela, só pode ser uma consulta. A expressão não pode conter:

    No corpo da função, você pode consultar o parâmetro pelo seu nome não qualificado ou qualificando-o com o nome da função.

  • COMO dollar_quoted_definition

    dollar_quoted_definition é a função body do Python incluída por dois $[tag]$body$[tag]$ correspondentes. tag pode ser uma cadeia de caracteres vazia.

    Exemplos:

    $$
      return “Hello world”
    $$
    
    $py$
      return "Hello World"
    $py$
    
  • MANIPULADOR handler_name

    Para uma função escalar LANGUAGE PYTHON de linha por vez:

    Aplica-se a:check marked yes Databricks SQL check marked yes Databricks Runtime 18.1 and above

    handler_nameé um STRING literal que nomeia a função Python na definição citada por dólar, que implementa o UDF. O manipulador aceita os argumentos UDF e retorna um valor que corresponde ao tipo de retorno declarado. Em computação serverless e em warehouses SQL pro e serverless, defina explicitamente os UDFs environment_version para 6 ou acima. Veja: Use um handler nomeado em um UDF escalar de Python.

    Para uma função batch LANGUAGE PYTHON declarada com PARAMETER STYLE PANDAS:

    Aplica-se a:verificação marcada como sim Databricks SQL verificação marcada como sim Databricks Runtime 16.3 e superior

    handler_nameé um STRING literal que nomeia a função Python na definição citada por dólar, que implementa o UDF. O manipulador aceita um iterador sobre um ou mais pandas.Series objetos e gera pandas.Series objetos com o mesmo número de linhas que a entrada. Veja a função do handler UDF em lote.

    Para uma LANGUAGE SCALA função ou LANGUAGE JAVA :

    Aplica-se a:check marked yes Databricks SQL check marked yes Databricks Runtime 18.2 and above

    O caminho totalmente qualificado para o método que implementa uma função ou LANGUAGE SCALA uma LANGUAGE JAVA função, como um STRING literal. Use o formato 'package.Object.method' para Scala e 'package.ClassName.method' para Java. O código compilado deve ser fornecido como um JAR por meio da java_dependencies chave da ENVIRONMENT cláusula.

  • CREDENTIALS ( service_credential [, ...] )

    Aplica-se a:verificação marcada como sim Databricks SQL verificação marcada como sim Databricks Runtime 16.3 e superior

    Declara uma ou mais credenciais de serviço do Unity Catalog que uma função batch LANGUAGE PYTHON pode usar. Funções escalares LANGUAGE PYTHON linha a linha exigem Databricks Runtime 18.1 ou superior na computação clássica. Em computação serverless e em repositórios SQL pro e serverless, funções escalares devem ser explicitamente definidas environment_version como 6 ou acima. Veja Usar uma credencial de serviço em um UDF Python para requisitos completos.

    Cada um credential_name nomeia uma credencial de serviço do Catálogo Unity. O criador do UDF deve ter o ACCESS privilégio de cada credencial de serviço. Marque no máximo uma credencial para DEFAULT que SDKs de nuvem atualizados a usem automaticamente. Use AS credential_alias para atribuir um alias único a uma credencial não padrão.

  • SEGREDOS ( secret_name [, ...] )

    Aplica-se a:com marca de verificação sim Databricks SQL marcado sim Databricks Runtime 19 e acima

    Declara os segredos do Catálogo Unity que uma função escalar ou batch LANGUAGE PYTHON ou uma função escalar LANGUAGE SCALA pode acessar. A definição do UDF deve definir environment_version explicitamente como 6 ou acima. Cada secret_name um deve ser um nome em três partes na forma catalog.schema.secret. Para criar ou substituir o UDF, você deve ter READ SECRET em cada segredo e USE CATALOGUSE SCHEMA em seu catálogo pai e esquema. Veja requisitos e permissões do UDF para suporte de computação e comportamento de permissões em tempo de execução. Para exemplos, veja UDFs em Python ou UDFs em Scala.

  • característica

    Todas as cláusulas de característica são opcionais. Você pode especificar qualquer número delas, em qualquer ordem, mas só pode especificar cada cláusula uma vez.

    • IDIOMA SQL, PYTHON DE LINGUAGEM, SCALA DE LINGUAGEM ou JAVA DE LINGUAGEM

      A linguagem da implementação da função. LANGUAGE SCALA e LANGUAGE JAVA exigir o Catálogo do Unity e uma HANDLER cláusula que faça referência ao código compilado fornecido por meio da ENVIRONMENT cláusula. Consulte Scala e Java UDFs (funções definidas pelo usuário) no Catálogo do Unity.

    • PANDAS DE ESTILO DE PARÂMETROS

      Aplica-se a:verificação marcada como sim Databricks SQL verificação marcada como sim Databricks Runtime 16.3 e superior

      Declara uma função batch LANGUAGE PYTHON que troca dados com o handler como iteradores de pandas.Series objetos. Você também deve especificar uma HANDLER cláusula. Consulte O Lote Python UDFs (funções definidas pelo usuário) no Catálogo do Unity.

    • [NÃO] DETERMINÍSTICO

      Se a função é determinística. Uma função é determinística quando retorna apenas um resultado para determinado conjunto de argumentos. Você pode marcar uma função como DETERMINISTIC quando seu corpo não é e vice-versa. Um motivo para isso pode ser incentivar ou desencorajar otimizações de consulta, como dobramento constante ou cache de consulta. Se você não especificar essa opção, o padrão depende da linguagem da função. Para funções SQL, ele é derivado do corpo da função. Para funções em Python, Scala e Java, a função é NOT DETERMINISTIC.

    • COMENTÁRIO function_comment

      Um comentário para a função. function_comment deve ser um literal de cadeia de caracteres.

    • CONTAINS SQL ou READS SQL DATA

      Se uma função lê dados direta ou indiretamente de uma tabela ou exibição. Quando a função lê SQL dados, você não pode especificar CONTAINS SQL. Se você não especificar nenhuma das cláusulas, a propriedade será derivada do corpo da função.

    • COLOCAÇÃO PADRÃO default_collation_name

      Aplica-se a:marcado como sim Databricks SQL marcado como sim Databricks Runtime 17.0 e superior

      Define a ordenação padrão a ser usada para:

      • STRING parâmetros, RETURNS tipo de dados e RETURNS TABLE campos da função.
      • Expressão DEFAULT.
      • O corpo da função SQL.

      Se não for especificado, a ordenação padrão será derivada do esquema no qual a função é criada.

  • ambiente

    Especifica o ambiente para uma função declarada com LANGUAGE PYTHON, LANGUAGE SCALAou LANGUAGE JAVA. A ENVIRONMENT cláusula não tem suporte para funções SQL. Você deve especificar environment_version sempre que incluir a ENVIRONMENT cláusula.

    • Dependências

      Uma matriz JSON de cadeias de caracteres especificando os pacotes Python necessários ou arquivos de roda para uma LANGUAGE PYTHON função. A chave dependencies não diferencia maiúsculas de minúsculas. Formatos com suporte:

      • Pacote PyPI com versão opcional, por exemplo: "simplejson==3.19.3"
      • Caminho absoluto para um arquivo de roda armazenado em um volume do Unity Catalog, por exemplo: "/Volumes/my_catalog/my_schema/my_volume/packages/custom_package-1.0.0.whl"
      • URL HTTPS para um arquivo wheel no armazenamento externo, por exemplo: "https://my-bucket.s3.amazonaws.com/packages/special_package-2.0.0.whl?Expires=..."

      Para uma dependência armazenada em um volume do Unity Catalog, o criador da função deve estar READ VOLUME no volume de origem. Os requisitos do chamador dependem da versão do ambiente. Veja Permissões para dependências em volumes do Catálogo Unity.

    • java_dependencies

      Aplica-se a:check marked yes Databricks SQL check marked yes Databricks Runtime 18.2 and above

      Uma matriz JSON de cadeias de caracteres que especifica os arquivos JAR que contêm o código compilado para uma LANGUAGE SCALA ou LANGUAGE JAVA função. Cada entrada é um caminho absoluto para um arquivo JAR armazenado em um volume do Catálogo do Unity, por exemplo: "/Volumes/my_catalog/my_schema/my_volume/packages/my-udf-assembly-0.1.0.jar". Empacote o código como um JAR gordo que inclui todas as dependências de terceiros usadas pelo UDF.

    • environment_version

      Uma string especificando a versão do ambiente.

      • Para LANGUAGE PYTHON, valores suportados são uma versão ambiental de 3 ou superior, como '6', ou 'None'. O valor 'None' seleciona o ambiente Python padrão. Na computação clássica, definir environment_version para um valor diferente 'None' requer Databricks Runtime 18.2 ou superior. No Databricks Runtime 16.2 a 18.1, apenas 'None' é suportado. Quando versões fixas do ambiente forem suportadas, selecione explicitamente uma para comportamento previsível.

        Em computação serverless e em repositórios SQL pro e serverless, alguns recursos exigem uma versão explícita do ambiente. Definido environment_version para a versão requerida ou acima em cada definição de UDF. Omitir a cláusula ou configuração environment_version = 'None' não habilita esses recursos. Veja requisitos de recursos do Python UDF.

        Para compatibilidade com versões de computação clássica, veja Versões do Ambiente na computação clássica. Para ver a lista de versões disponíveis, consulte Versões de ambiente.

      • Para LANGUAGE SCALA e LANGUAGE JAVA, o valor deve ser '4' ou superior. A versão 4 do Ambiente especifica Scala 2.13.16 e JDK 17. Veja Versões do Ambiente.

Bibliotecas compatíveis em UDFs do Python

Para usar quaisquer dependências, use import <package> dentro do corpo da função. Por exemplo, confira a seguir:

CREATE FUNCTION […]
AS $$
   import json
   [... (rest of function definition)]
$$

Por padrão, as dependências são limitadas à biblioteca padrão do Python e às seguintes bibliotecas:

Pacote Versão
bleach 4.0.0
chardet 4.0.0
normalizador de conjunto de caracteres 2.0.4
defusedxml 0.7.1
googleapis-common-protos 1.56.4
grpcio 1.47.0
grpcio-status 1.47.0
jmespath 0.10.0
joblib 1.1.0
numpy 1.20.3
empacotamento 21,3
Pandas 1.3.4
patsy 0.5.2
protobuf 4.21.5
pyarrow 7.0.0
pyparsing 3.0.9
python-dateutil 2.8.2
pytz 2021.3
scikit-learn 0.24.2”
scipy 1.7.1”
setuptools 65.2.0
seis 1.16.0
threadpoolctl 3.1.0
codificações web 0.5.1
user-agents 2.2.0
criptografia 38.0.4

Dependências personalizadas em UDFs do Python

Para usar dependências adicionais além da biblioteca padrão e dos pacotes internos com suporte, especifique-as na ENVIRONMENT cláusula.

Exemplos

Criar e usar uma função escalar SQL

> CREATE VIEW t(c1, c2) AS VALUES (0, 1), (1, 2);
-- Create a temporary function with no parameter.
> CREATE TEMPORARY FUNCTION hello() RETURNS STRING
    RETURN 'Hello World!';

> SELECT hello();
  Hello World!

-- Create a permanent function with parameters.
> CREATE FUNCTION area(x DOUBLE, y DOUBLE) RETURNS DOUBLE RETURN x * y;

-- Use a SQL function in the SELECT clause of a query.
> SELECT area(c1, c2) AS area FROM t;
 0.0
 2.0

-- Use a SQL function in the WHERE clause of a query.
> SELECT * FROM t WHERE area(c1, c2) > 0;
 1  2

-- Compose SQL functions.
> CREATE FUNCTION square(x DOUBLE) RETURNS DOUBLE RETURN area(x, x);

> SELECT c1, square(c1) AS square FROM t;
  0  0.0
  1  1.0

-- Create a non-deterministic function
> CREATE FUNCTION roll_dice()
    RETURNS INT
    NOT DETERMINISTIC
    CONTAINS SQL
    COMMENT 'Roll a single 6 sided die'
    RETURN (rand() * 6)::INT + 1;
-- Roll a single 6-sided die
> SELECT roll_dice();
 3

Criar e usar uma função que usa padrões

-- Extend the function to support variable number of sides and dice.
-- Use defaults to support a variable number of arguments
> DROP FUNCTION roll_dice;
> CREATE FUNCTION roll_dice(num_dice  INT DEFAULT 1 COMMENT 'number of dice to roll (Default: 1)',
                            num_sides INT DEFAULT 6 COMMENT 'number of sides per die (Default: 6)')
    RETURNS INT
    NOT DETERMINISTIC
    CONTAINS SQL
    COMMENT 'Roll a number of n-sided dice'
    RETURN aggregate(sequence(1, roll_dice.num_dice, 1),
                     0,
                     (acc, x) -> (rand() * roll_dice.num_sides)::int,
                     acc -> acc + roll_dice.num_dice);

-- Roll a single 6-sided die still works
> SELECT roll_dice();
 3

-- Roll 3 6-sided dice
> SELECT roll_dice(3);
 15

-- Roll 3 10-sided dice
> SELECT roll_dice(3, 10)
 21

-- Roll 3 10-sided dice using named parameter invocation
> SELECT roll_dice(10 => num_sides, num_dice => 3)
 17

-- Create a SQL function with a scalar subquery.
> CREATE VIEW scores(player, score) AS VALUES (0, 1), (0, 2), (1, 2), (1, 5);

> CREATE FUNCTION avg_score(p INT) RETURNS FLOAT
    COMMENT 'get an average score of the player'
    RETURN SELECT AVG(score) FROM scores WHERE player = p;

> SELECT c1, avg_score(c1) FROM t;
 0  1.5
 1  3.5

Criar uma função de tabela SQL

-- Produce all weekdays between two dates
> CREATE FUNCTION weekdays(start DATE, end DATE)
    RETURNS TABLE(day_of_week STRING, day DATE)
    RETURN SELECT extract(DAYOFWEEK_ISO FROM day), day
             FROM (SELECT sequence(weekdays.start, weekdays.end)) AS T(days)
                  LATERAL VIEW explode(days) AS day
             WHERE extract(DAYOFWEEK_ISO FROM day) BETWEEN 1 AND 5;

-- Return all weekdays
> SELECT weekdays.day_of_week, day
    FROM weekdays(DATE'2022-01-01', DATE'2022-01-14');
  1     2022-01-03
  2     2022-01-04
  3     2022-01-05
  4     2022-01-06
  5     2022-01-07
  1     2022-01-10
  2     2022-01-11
  3     2022-01-12
  4     2022-01-13
  5     2022-01-14

-- Return weekdays for date ranges originating from a LATERAL correlation
> SELECT weekdays.*
    FROM VALUES (DATE'2020-01-01'),
                (DATE'2021-01-01'),
                (DATE'2022-01-01') AS starts(start),
         LATERAL weekdays(start, start + INTERVAL '7' DAYS);
  3     2020-01-01
  4     2020-01-02
  5     2020-01-03
  1     2020-01-06
  2     2020-01-07
  3     2020-01-08
  5     2021-01-01
  1     2021-01-04
  2     2021-01-05
  3     2021-01-06
  4     2021-01-07
  5     2021-01-08
  1     2022-01-03
  2     2022-01-04
  3     2022-01-05
  4     2022-01-06
  5     2022-01-07

Substituir uma função SQL

-- Replace a SQL scalar function.
> CREATE OR REPLACE FUNCTION square(x DOUBLE) RETURNS DOUBLE RETURN x * x;

-- Replace a SQL table function.
> CREATE OR REPLACE FUNCTION getemps(deptno INT)
    RETURNS TABLE (name STRING)
    RETURN SELECT name FROM employee e WHERE e.deptno = getemps.deptno;

-- Describe a SQL table function.
> DESCRIBE FUNCTION getemps;
 Function: default.getemps
 Type:     TABLE
 Input:    deptno INT
 Returns:  id   INT
           name STRING

Observação

Não é possível substituir uma função existente por uma assinatura diferente.

Descrever uma função SQL

> DESCRIBE FUNCTION hello;
 Function: hello
 Type:     SCALAR
 Input:    ()
 Returns:  STRING

> DESCRIBE FUNCTION area;
 Function: default.area
 Type:     SCALAR
 Input:    x DOUBLE
           y DOUBLE
 Returns:  DOUBLE

> DESCRIBE FUNCTION roll_dice;
 Function: default.roll_dice
 Type:     SCALAR
 Input:    num_dice  INT
           num_sides INT
 Returns:  INT

> DESCRIBE FUNCTION EXTENDED roll_dice;
 Function:      default.roll_dice
 Type:          SCALAR
 Input:         num_dice  INT DEFAULT 1 'number of dice to roll (Default: 1)'
                num_sides INT DEFAULT 6 'number of sides per dice (Default: 6)'
 Returns:       INT
 Comment:       Roll a number of m-sided dice
 Deterministic: false
 Data Access:   CONTAINS SQL
 Configs:       ...
 Owner:         the.house@always.wins
 Create Time:   Sat Feb 12 09:29:02 PST 2022
 Body:          aggregate(sequence(1, roll_dice.num_dice, 1),
                      0,
                      (acc, x) -> (rand() * roll_dice.num_sides)::int,
                      acc -> acc + roll_dice.num_dice)

Criar funções do Python

-- Hello World-like functionality using Python UDFs
> CREATE FUNCTION main.default.greet(s STRING)
  RETURNS STRING
  LANGUAGE PYTHON
  AS $$
    def greet(name):
      return "Hello " + name + "!"

    return greet(s) if s else None
  $$

-- Can import functions from std library and environment
> CREATE FUNCTION main.default.isleapyear(year INT)
  RETURNS BOOLEAN
  LANGUAGE PYTHON
  AS $$
    import calendar
    return calendar.isleap(year) if year else None
  $$

-- Return values should match the declared data type.
> CREATE FUNCTION main.default.a_number()
  RETURNS INTEGER
  LANGUAGE PYTHON
  AS $$
    return 10
  $$

-- Deal with exceptions.
> CREATE FUNCTION main.default.custom_divide(n1 INT, n2 INT)
  RETURNS FLOAT
  LANGUAGE PYTHON
  AS $$
    try:
      return n1/n2
    except ZeroDivisionException:
    # in case of 0, we can return NULL.
    return None
  $$

Definir dependências personalizadas em funções do Python

-- Create a Python function with additional dependencies using the ENVIRONMENT clause.
> CREATE FUNCTION main.default.dump_json(data STRING)
    RETURNS STRING
    LANGUAGE PYTHON
    ENVIRONMENT (
      dependencies = '["simplejson==3.19.3", "/Volumes/my_catalog/my_schema/my_volume/packages/custom_package-1.0.0.whl", "https://my-bucket.s3.amazonaws.com/packages/special_package-2.0.0.whl?Expires=2043167927&Signature=abcd"]',
      environment_version = '6'
    )
    AS $$
      import simplejson as json
      import custom_package
      return json.dumps(custom_package.process(data))
    $$;

-- Use the Python function in a query.
> SELECT dump_json('{"foo": "bar"}');

Criar funções Scala e Java

Os exemplos a seguir registram um UDF do código JVM compilado empacotado como um JAR em um volume do Catálogo do Unity. A HANDLER cláusula faz referência ao método no JAR e a java_dependencies chave aponta para o JAR. Para obter o fluxo de trabalho completo, incluindo como criar o JAR, consulte Scala e Java UDFs (funções definidas pelo usuário) no Catálogo do Unity.

-- Register a Scala UDF from a JAR in a Unity Catalog volume.
> CREATE OR REPLACE FUNCTION my_catalog.my_schema.add_one_scala(x INT)
    RETURNS INT
    LANGUAGE SCALA
    DETERMINISTIC
    ENVIRONMENT (
      java_dependencies = '["/Volumes/my_catalog/my_schema/udf_jars/my-udf-assembly-0.1.0.jar"]',
      environment_version = '4'
    )
    HANDLER 'com.example.ScalaUDF.addOne';

-- Register a Java UDF from a JAR in a Unity Catalog volume.
> CREATE OR REPLACE FUNCTION my_catalog.my_schema.add_one_java(x INT)
    RETURNS INT
    LANGUAGE JAVA
    DETERMINISTIC
    ENVIRONMENT (
      java_dependencies = '["/Volumes/my_catalog/my_schema/udf_jars/my-udf-1.0.jar"]',
      environment_version = '4'
    )
    HANDLER 'com.example.JavaUDF.addOne';

-- Use the functions in a query.
> SELECT my_catalog.my_schema.add_one_scala(5);
 6
> SELECT my_catalog.my_schema.add_one_java(5);
 6