Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:
Databricks SQL
Databricks Runtime
Cria uma função escalar ou de tabela SQL que usa um conjunto de argumentos e retorna um valor escalar ou um conjunto de linhas.
Aplica-se a:
Databricks SQL
Databricks Runtime 13.3 LTS e superior
Cria uma função escalar Python que usa um conjunto de argumentos e retorna um valor escalar.
As UDFs Python exigem o Unity Catalog em armazéns SQL sem servidor ou armazéns SQL profissionais, ou um recurso computacional habilitado para Unity Catalog.
Aplica-se a:
Databricks SQL
Databricks Runtime 14.1 e superior
Além da invocação de parâmetros posicionais, também é possível invocar SQL e UDF Python usando a invocação de parâmetros nomeados.
Aplica-se a:
Databricks SQL
Databricks Runtime 16.2 e superior
Use a ENVIRONMENT cláusula para instalar dependências personalizadas e definir 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:
Databricks SQL
Databricks Runtime 16.3 e superior
Use PARAMETER STYLE PANDAS com a HANDLER cláusula para definir uma função batch LANGUAGE PYTHON . O handler processa dados de entrada como iteradores de pandas.Series objetos e gera pandas.Series objetos como saída.
Aplica-se a:
Databricks SQL,
Databricks Runtime 18.1 ou superiores
Use a HANDLER cláusula com uma função escalar LANGUAGE PYTHON linha a linha para nomear a função Python que gere as entradas UDF. Em computação serverless e em armazéns SQL pro e serverless, defina explicitamente os UDFs environment_version para 6 ou acima.
Aplica-se a:
Databricks SQL
Databricks Runtime 16.3 e superior
Use a CREDENTIALS cláusula para declarar credenciais de serviço do Unity Catalog a que uma função escalar LANGUAGE PYTHON batch ou linha a linha acede. Veja Usar uma credencial de serviço num UDF Python para requisitos de tipo de função, computação, ambiente e rede.
Aplica-se a:
Databricks SQL
Databricks Runtime 19 e superiores
Use a SECRETS cláusula para declarar segredos do Catálogo Unity a que uma função escalar, batch LANGUAGE PYTHON ou uma função escalar LANGUAGE SCALA acede. Consulte requisitos e permissões do UDF para requisitos de computação, ambiente e permissões.
Aplica-se a:
Databricks SQL
Databricks Runtime 18.2 e superiores
Cria uma função escalar Scala ou Java que executa lógica JVM compilada embalada como JAR. Os UDFs Scala e Java requerem o Unity Catalog. O suporte para SQL Warehouses está limitado a SQL Warehouses Pro e serverless. Referencias o código compilado com a HANDLER cláusula e forneces o JAR através da ENVIRONMENT chave da java_dependencies cláusula. Para o fluxo de trabalho completo, incluindo como construir o JAR e registar a função, consulte Scala e funções definidas pelo utilizador (UDFs) em Java no Unity Catalog.
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 for especificado, a função com o mesmo nome e assinatura (número de parâmetros e tipos de parâmetros) é substituída. Não é possível substituir uma função existente por uma assinatura ou um procedimento diferente. Isso é útil principalmente para atualizar o corpo da função e o tipo de retorno da função. Não é possível especificar esse parâmetro com
IF NOT EXISTS.TEMPORÁRIO
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 existe. A criação da função é bem-sucedida (nenhum erro é lançado) se a função especificada já existir no sistema. Não é possível especificar esse parâmetro com
OR REPLACE.-
Um nome para a função. Para uma função permanente, você pode, opcionalmente, 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.
-
O nome do parâmetro deve ser exclusivo dentro da função.
-
Qualquer tipo de dados suportado. Para Python,
data_typeé convertido para um tipo de dados Python de acordo com este mapeamento de linguagem.Para um
STRINGdata_type, o agrupamento padrão é a funçãodefault_collation_name. PADRÃO default_expression
Aplica-se a:
Databricks SQL
Databricks Runtime 10.4 LTS e superiorUm padrão opcional a ser usado quando uma invocação de função não atribui um argumento ao parâmetro.
default_expressiondeve poder ser convertível paradata_type. A expressão não deve fazer referência a outro parâmetro ou conter uma subconsulta.Quando você especifica um padrão para um parâmetro, todos os parâmetros a seguir também devem ter um padrão.
DEFAULTé suportado apenas paraLANGUAGE SQL.COMENTÁRIO comentário
Uma descrição opcional do parâmetro.
commentdeve ser umSTRINGliteral.
-
RETORNA data_type
O tipo de dados de retorno da função escalar. Para UDFs em Python, os valores de retorno devem corresponder aos valores declarados
data_type.Para SQL UDF, esta cláusula é opcional. O tipo de dado é derivado do corpo da função caso não seja fornecido.
RETORNA TABLE [ (column_spec [,...] ) ]
Esta cláusula marca a função como uma função de tabela. Opcionalmente, também especifica a assinatura do resultado da função de tabela. Se nenhum column_spec for especificado, ele será derivado do corpo do SQL UDF.
RETURNS TABLEé suportado paraLANGUAGE SQLe paraLANGUAGE PYTHONUDTFs polimórficas (Databricks Runtime 18.1 e superiores).-
O nome da coluna deve ser único dentro da assinatura.
-
Qualquer tipo de dados suportado.
COMENTÁRIO column_comment
Uma descrição opcional da coluna.
commentdeve ser umSTRINGliteral.
-
RETURN { expressão | consulta }
O corpo da função. Para uma função escalar, pode ser uma consulta ou uma expressão. Para uma função de tabela, só pode ser uma consulta. A expressão não pode conter:
- Funções agregadas
- Funções do Windows
- Funções de classificação
- Funções que geram linhas, como explode
Dentro do corpo da função, você pode se referir ao parâmetro por seu nome não qualificado ou qualificando o parâmetro com o nome da função.
DEFINIÇÃO DO DÓLAR
dollar_quoted_definitioné a funçãobodyPython delimitada por dois correspondentes$[tag]$body$[tag]$.tagpode ser uma cadeia de caracteres vazia.Exemplos:
$$ return “Hello world” $$ $py$ return "Hello World" $py$MANIPULADOR handler_name
Para uma função escalar
LANGUAGE PYTHONlinha de cada vez:Aplica-se a:
Databricks SQL,
Databricks Runtime 18.1 ou superioreshandler_nameé umSTRINGliteral que nomeia a função Python na definição citada que implementa o UDF. O handler aceita os argumentos UDF e devolve um valor que corresponde ao tipo de retorno declarado. Em computação serverless e em armazéns SQL pro e serverless, defina explicitamente os UDFsenvironment_versionpara6ou acima. Veja Usar um handler nomeado num UDF escalar de Python.Para uma função em lote
LANGUAGE PYTHONdeclarada comPARAMETER STYLE PANDAS:Aplica-se a:
Databricks SQL
Databricks Runtime 16.3 e superiorhandler_nameé umSTRINGliteral que nomeia a função Python na definição citada que implementa o UDF. O manipulador aceita um iterador sobre um ou maispandas.Seriesobjetos e produzpandas.Seriesobjetos com o mesmo número de linhas que a entrada. Ver função de handler UDF em lote.Para uma
LANGUAGE SCALAfunção ouLANGUAGE JAVA:Aplica-se a:
Databricks SQL
Databricks Runtime 18.2 e superioresO caminho totalmente qualificado para o método que implementa uma
LANGUAGE SCALAfunção ouLANGUAGE JAVA, comoSTRINGliteral. Use o formato'package.Object.method'para Scala e'package.ClassName.method'para Java. O código compilado deve ser fornecido como um JAR através dajava_dependencieschave daENVIRONMENTcláusula.CREDENTIALS ( service_credential [, ...] )
Aplica-se a:
Databricks SQL
Databricks Runtime 16.3 e superiorDeclara uma ou mais credenciais de serviço do Catálogo Unity que uma função batch
LANGUAGE PYTHONpode usar. As funções escalaresLANGUAGE PYTHONlinha a linha requerem Databricks em tempo de execução 18.1 ou superior na computação clássica. Em computação serverless e em armazéns SQL pro e serverless, as funções escalares devem ser explicitamente definidasenvironment_versioncomo6ou superiores. Veja Usar uma credencial de serviço num UDF Python para requisitos completos.Cada um
credential_namenomeia uma credencial de serviço do Unity Catalog. O criador do UDF deve ter oACCESSprivilégio de cada credencial de serviço. Marque no máximo uma credencial paraDEFAULTque os SDKs cloud atualizados a usem automaticamente. UseAS credential_aliaspara atribuir um alias único a uma credencial não padrão.SEGREDOS ( secret_name [, ...] )
Aplica-se a:
Databricks SQL
Databricks Runtime 19 e superioresDeclara os segredos do Catálogo Unity a que uma função escalar, batch
LANGUAGE PYTHONou uma função escalarLANGUAGE SCALApode aceder. A definição UDF deve definirenvironment_versionexplicitamente como6ou superior. Cadasecret_nameum deve ser um nome em três partes na formacatalog.schema.secret. Para criar ou substituir o UDF, deve terREAD SECRETem cada segredo eUSE CATALOGUSE SCHEMAno seu catálogo pai e esquema. Consulte os 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 Python ou UDFs Scala.característica
Todas as cláusulas características são opcionais. Você pode especificar qualquer número deles em qualquer ordem, mas pode especificar cada cláusula apenas uma vez.
LANGUAGE SQL,LANGUAGE PYTHON, LANGUAGE SCALA, ou LANGUAGE JAVA
A linguagem da implementação da função.
LANGUAGE SCALAeLANGUAGE JAVAexigem o Unity Catalog e umaHANDLERcláusula que faça referência ao código compilado fornecido através daENVIRONMENTcláusula. Veja Scala e funções definidas pelo utilizador (UDFs) em Java no Catálogo Unity.PANDAS DE ESTILO DE PARÂMETROS
Aplica-se a:
Databricks SQL
Databricks Runtime 16.3 e superiorDeclara uma função batch
LANGUAGE PYTHONque troca dados com o handler como iteradores depandas.Seriesobjetos. Deve também especificar umaHANDLERcláusula. Consulte funções Python definidas pelo utilizador (UDFs) em lote no Unity Catalog.[NÃO] DETERMINÍSTICO
Se a função é determinística. Uma função é determinística quando retorna apenas um resultado para um determinado conjunto de argumentos. Você pode marcar uma função como
DETERMINISTICquando o corpo da função não o é e vice-versa. Uma razão para isso pode ser incentivar ou desencorajar otimizações de consulta, como simplificação constante ou cache de consulta. Se não especificar esta opção, o padrão depende da linguagem da função. Para funções SQL, é 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 funcionalidade.
function_commentdeve ser literal String.CONTÉM SQL ou LÊ DADOS SQL
Se uma função lê dados direta ou indiretamente de uma tabela ou exibição. Quando a função lê dados SQL, você não pode especificar
CONTAINS SQL. Caso não especifique nenhuma das cláusulas, a propriedade será derivada do corpo da função.COTEJAMENTO PADRÃO default_collation_name
Aplica-se a:
Databricks SQL
Databricks Runtime 17.0 e superioresDefine o agrupamento padrão a ser usado para:
-
STRINGparâmetros eRETURNStipo de dados eRETURNS TABLEcampos da função. -
DEFAULTexpressão. - O corpo da função SQL.
Se não for especificado, o agrupamento padrão é derivado do esquema no qual a função é criada.
-
Meio Ambiente
Especifica o ambiente para uma função declarada com
LANGUAGE PYTHON,LANGUAGE SCALA, ouLANGUAGE JAVA. AENVIRONMENTcláusula não é suportada para funções SQL. Deve especificarenvironment_versionsempre que incluir aENVIRONMENTcláusula.dependências
Um array JSON de strings que especificam os pacotes Python ou ficheiros wheel necessários para uma
LANGUAGE PYTHONfunção. Adependencieschave não diferencia maiúsculas de minúsculas. Formatos suportados:- Pacote PyPI com versão opcional, por exemplo: "simplejson==3.19.3"
- Caminho absoluto para um ficheiro wheel guardado num volume do Unity Catalog, por exemplo: "/Volumes/meu_catalogo/minha_esquema/meu_volume/pacotes/pacote_personalizado-1.0.0.whl"
- URL HTTPS para um arquivo de roda no armazenamento externo, por exemplo: "https://my-bucket.s3.amazonaws.com/packages/special_package-2.0.0.whl?Expires=..."
Para uma dependência armazenada num volume do Unity Catalog, o criador da função deve estar
READ VOLUMEno volume de origem. Os requisitos do chamador dependem da versão do ambiente. Ver Permissões para dependências em volumes do Catálogo Unity.java_dependencies
Aplica-se a:
Databricks SQL
Databricks Runtime 18.2 e superioresUm array JSON de strings que especifica os ficheiros JAR que contêm o código compilado para uma
LANGUAGE SCALAfunção ouLANGUAGE JAVA. Cada entrada é um caminho absoluto para um ficheiro JAR armazenado num volume do Unity Catalog, por exemplo: "/Volumes/my_catalog/my_schema/my_volume/packages/my-udf-assembly-0.1.0.jar". Empacota o código como um fat JAR que inclui todas as dependências de terceiros usadas pela UDF.environment_version
Uma cadeia que especifica 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, definirenvironment_versionpara um valor diferente'None'de requer Databricks Runtime 18.2 ou superior. Nos Databricks, apenas'None'o tempo de execução 16.2 a 18.1 é suportado. Quando são suportadas versões fixas do ambiente, selecione explicitamente uma para comportamento previsível.Em computação serverless e em SQL warehouses pro e serverless, algumas funcionalidades requerem uma versão explícita do ambiente. Definido
environment_versionpara a versão exigida ou superior em cada definição de UDF. Omitir a cláusula ou definiçãoenvironment_version = 'None'não permite essas funcionalidades. Consulte os requisitos de funcionalidades do Python UDF.Para compatibilidade de versões de computação clássica, veja Versões de Ambiente no computo clássico. Para consultar a lista de versões disponíveis, consulte Versões de ambiente.
Para
LANGUAGE SCALAeLANGUAGE JAVA, o valor deve ser'4'ou superior. A versão 4 do ambiente especifica o Scala 2.13.16 e o JDK 17. Ver Versões do Ambiente.
Bibliotecas suportadas em UDFs Python
Para usar quaisquer dependências, use import <package> dentro do corpo da função. Por exemplo, consulte o seguinte:
CREATE FUNCTION […]
AS $$
import json
[... (rest of function definition)]
$$
Por padrão, as dependências são limitadas à biblioteca Python padrão e às seguintes bibliotecas:
| Pacote | Versão |
|---|---|
| lixívia | 4.0.0 |
| Chardet | 4.0.0 |
| Normalizador de Charset | 2.0.4 |
| DeUsedXML | 0.7.1 |
| googleapis-comuns-protos | 1.56.4 |
| Grpcio | 1.47.0 |
| grpcio-status | 1.47.0 |
| JmesPath | 0.10.0 |
| Joblib | 1.1.0 |
| dormência | 1.20.3 |
| embalagem | 21,3 |
| pandas | 1.3.4 |
| bode expiatório | 0.5.2 |
| Protobuf | 4.21.5 |
| Pyarrow | 7.0.0 |
| Pyparsing | 3.0.9 |
| python-dateutil (uma biblioteca de software para manipulação de datas em Python) | 2.8.2 |
| Pytz | 2021.3 |
| scikit-learn (biblioteca de aprendizado de máquina em Python) | 0.24.2” |
| SciPy | 1.7.1” |
| Ferramentas de configuração | 65.2.0 |
| seis | 1.16.0 |
| ThreadPoolCtl | 3.1.0 |
| WebEncodings | 0.5.1 |
| agentes de usuário | 2.2.0 |
| criptografia | 38.0.4 |
Dependências personalizadas em UDFs Python
Para usar dependências adicionais além da biblioteca padrão e dos pacotes internos suportados, especifique-as ENVIRONMENT na cláusula.
Exemplos
- Criar e usar uma função escalar SQL
- Criar e usar uma função que usa DEFAULTs
- Criar uma função de tabela SQL
- Substituir uma função SQL
- Descrever uma função SQL
- Criar funções Python
- Definir dependências personalizadas em funções Python
- Criar funções Scala e Java
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 DEFAULTs
-- 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
Nota
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 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 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 seguintes registam um UDF a partir de código JVM compilado empacotado como JAR num volume do Unity Catalog. A HANDLER cláusula faz referência ao método no JAR e aos java_dependencies pontos-chave para o JAR. Para o fluxo de trabalho completo, incluindo como construir o JAR, consulte Scala e funções definidas pelo utilizador (UDFs) em Java no Catálogo 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