Criação de uma UDF Python escalar - Amazon Redshift

Criação de uma UDF Python escalar

Uma UDF Python escalar incorpora um programa Python que é executado quando a função é chamada e retorna um valor único. O comando CREATE FUNCTION define os seguintes parâmetros:

  • Argumentos de entrada (opcionais). Cada argumento deve ter um nome e um tipo de dados.

  • Um tipo de dados de retorno.

  • Um programa Python executável.

Os tipos de dados de entrada e retorno podem ser SMALLINT, INTEGER, BIGINT, DECIMAL, REAL, DOUBLE PRECISION, BOOLEAN, CHAR, VARCHAR, DATE ou TIMESTAMP. Além disso, UDFs Python podem usar o tipo de dados ANYELEMENT, que o Amazon Redshift converte automaticamente em um tipo de dados padrão com base nos argumentos fornecidos no tempo de execução. Para obter mais informações, consulte Tipo de dados ANYELEMENT.

Quando uma consulta do Amazon Redshift chama uma UDF escalar, as seguintes etapas ocorrem no tempo de execução:

  1. A função converte os argumentos de entrada para tipos de dados Python.

    Para obter um mapeamento de tipos de dados Amazon Redshift para tipos de dados Python, consulte Tipos de dados da UDF Python.

  2. A função executa o programa Python, passando os argumentos de entrada convertidos.

  3. O código Python retorna um único valor. O tipo de dados do valor de retorno deve corresponder ao tipo de dados de RETURNS especificado pela definição da função.

  4. A função converte o valor de retorno do Python no tipo de dados Amazon Redshift especificado e, em seguida, retorna esse valor para a consulta.

nota

O Python 3 não está disponível para UDFs do Python. Para obter suporte ao Python 3 para UDFs do Amazon Redshift, use Criar uma UDF do Lambda escalar.

Exemplo de UDF Python escalar

O seguinte exemplo cria uma função que compara dois números e retorna o maior valor. Observe que o recuo do código entre os cifrões duplos ($$) é um requisito do Python. Para ter mais informações, consulte CREATE FUNCTION.

create function f_py_greater (a float, b float) returns float stable as $$ if a > b: return a return b $$ language plpythonu;

A seguinte consulta chama a nova função f_greater para consultar a tabela SALES e retornar a COMMISSION ou 20 por cento de PRICEPAID, o que for maior.

select f_py_greater (commission, pricepaid*0.20) from sales;

Tipo de dados ANYELEMENT

ANYELEMENT é um tipo de dados polimórfico. Isso significa que se uma função for declarada usando ANYELEMENT para o tipo de dados de um argumento, a função pode aceitar qualquer tipo de dados Amazon Redshift padrão como entrada para esse argumento quando a função é chamada. O argumento de ANYELEMENT é definido para o tipo de dados realmente transmitido para ele quando a função é chamada.

Se uma função usa vários tipos de dados ANYELEMENT, todos devem se resolver para o mesmo tipo de dados real quando a função é chamada. Todos os tipos de dados de argumento ANYELEMENT são definidos como o tipo de dados real do primeiro argumento transmitido para um ANYELEMENT. Por exemplo, uma função declarada como f_equal(anyelement, anyelement) aceitará quaisquer dois valores de entrada, desde que eles sejam do mesmo tipo de dados.

Se o valor de retorno de uma função é declarado como ANYELEMENT, pelo menos um argumento de entrada deve ser ANYELEMENT. O tipo de dados real para o valor de retorno é o mesmo que o tipo de dados real fornecido para o argumento de entrada ANYELEMENT.