Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Aplica-se a:
SQL do Databricks
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:
SQL do Databricks
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:
SQL do Databricks
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:
Databricks SQL
Databricks Runtime 16.2 e versões superiores
Use a ENVIRONMENT cláusula para especificar o ambiente python para uma função declarada com LANGUAGE PYTHON. Usado para instalar dependências personalizadas e definir a versão do ambiente.
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 | 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 } |
[NOT] DETERMINISTIC |
COMMENT function_comment |
[CONTAINS SQL | READS SQL DATA] |
DEFAULT COLLATION default_collation_name } |
environment }
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.-
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.
-
O nome do parâmetro deve ser exclusivo na função.
-
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çãodefault_collation_name. PADRÃO default_expression
Aplica-se a:
SQL do Databricks
LTS do Databricks Runtime 10.4 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 ser conversível emdata_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 comLANGUAGE SQL.Comentário COMMENT
Uma descrição opcional do parâmetro.
commentdeve ser uma literal deSTRING.
-
RETORNA data_type
O tipo de dados de retorno da função escalar. Para UDFs do Python, os valores retornados devem corresponder exatamente ao tipo de dados, conforme especificado em
data_type. Caso contrário, para evitar conversões de tipo inesperadas, a função falhará.Para a UDF do SQL, essa cláusula é opcional. O tipo de dados será derivado do corpo da função se não for 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é compatível apenas comLANGUAGE SQL.-
O nome da coluna deve ser exclusivo na assinatura.
-
Qualquer tipo de dados com suporte.
COMENTÁRIO column_comment
Uma descrição opcional da coluna.
commentdeve ser uma literal deSTRING.
-
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:
- Funções de agregação
- Funções da janela
- Funções de classificação
- Funções de produção de linha, como detalhar
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çãobodydo Python incluída por dois$[tag]$body$[tag]$correspondentes.tagpode ser uma cadeia de caracteres vazia.Exemplos:
$$ return “Hello world” $$ $py$ return "Hello World" $py$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.
LANGUAGE SQL ou LANGUAGE PYTHON
A linguagem da implementação da função.
[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
DETERMINISTICquando 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, ela será derivada do corpo da função.COMENTÁRIO function_comment
Um comentário para a função.
function_commentdeve 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:
Databricks SQL
Databricks Runtime 17.0 e superiorDefine a ordenação padrão a ser usada para:
-
STRINGparâmetros,RETURNStipo de dados eRETURNS TABLEcampos 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 do Python para uma função declarada com
LANGUAGE PYTHON. AENVIRONMENTcláusula não tem suporte para funções SQL.Dependências
Uma matriz JSON de cadeias de caracteres especificando os pacotes ou arquivos de roda do Python necessários para a função. A chave
dependenciesnã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=..."
environment_version
Uma cadeia de caracteres que especifica a versão do ambiente do Python. Use
Nonepara usar o ambiente padrão do Python. Se omitido, o ambiente padrão será usado.- No momento, há suporte apenas para o valor
None.
- No momento, há suporte apenas para o valor
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
- Criar e usar uma função que usa PADRÃO
- Criar uma função de tabela SQL
- Substituir uma função SQL
- Descrever uma função SQL
- Criar funções do Python
- Definir dependências personalizadas em funções do Python
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
$$
—- Must return the correct type. Otherwise will fail at runtime.
> CREATE FUNCTION main.default.a_number()
RETURNS INTEGER
LANGUAGE PYTHON
AS $$
# does not work: return "10"
# does not work: return 3.14
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 = 'None'
)
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"}');