创建标量 Python UDF - Amazon Redshift

创建标量 Python UDF

标量 Python UDF 纳入了当此函数被调用并返回单个值时执行的一个 Python 程序。CREATE FUNCTION 命令定义以下参数:

  • (可选)输入参数。每个参数均必须具有一个名称和一个数据类型。

  • 一个返回数据类型。

  • 一个可执行的 Python 程序。

输入和返回数据类型可以为 SMALLINT、INTEGER、BIGINT、DECIMAL、REAL、DOUBLE PRECISION、BOOLEAN、CHAR、VARCHAR、DATE 或 TIMESTAMP。此外,Python UDF 可以使用 ANYELEMENT 数据类型,Amazon Redshift 会根据在运行时提供的参数自动将该数据类型转换为标准数据类型。有关更多信息,请参阅ANYELEMENT 数据类型

当 Amazon Redshift 查询调用标量 UDF 时,以下步骤将在运行时发生。

  1. 函数将输入参数转换为 Python 数据类型。

    有关 Amazon Redshift 数据类型到 Python 数据类型的映射,请参阅Python UDF 数据类型

  2. 函数执行 Python 程序,并传递转换后的输入参数。

  3. Python 代码返回一个值。返回值的数据类型必须对应于函数定义所指定的 RETURNS 数据类型。

  4. 函数将 Python 返回值转换为指定的 Amazon Redshift 数据类型,然后将该值返回到查询。

注意

Python 3 不适用于 Python UDF。要获得 Python 3 对 Amazon Redshift UDF 的支持,请改用 创建标量 Lambda UDF

标量 Python UDF 示例

以下示例创建一个用于比较两个数并返回较大值的函数。请注意,双美元符号 ($$) 之间代码的缩进是一项 Python 要求。有关更多信息,请参阅 CREATE FUNCTION

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

以下查询将调用新的 f_greater 函数以查询 SALES 表,并返回 COMMISSION 或 PRICEPAID 的 20% (两个值中的较大者)。

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

ANYELEMENT 数据类型

ANYELEMENT 是一种多态数据类型。这意味着,如果使用 ANYELEMENT 为参数的数据类型声明一个函数,则在调用该函数时,该函数可接受任何标准 Amazon Redshift 数据类型作为该参数的输入。ANYELEMENT 参数应设置为调用该函数时实际传递给该参数的数据类型。

如果某个函数使用多个 ANYELEMENT 数据类型,那么在调用该函数时,必须将这些数据类型全部解析为相同的实际数据类型。所有 ANYELEMENT 参数数据类型应设置为传递给 ANYELEMENT 的第一个参数的实际数据类型。例如,声明为 f_equal(anyelement, anyelement) 的函数将采用任意两个输入值,只要它们属于相同的数据类型。

如果某个函数的返回值声明为 ANYELEMENT,则至少一个输入参数必须是 ANYELEMENT。该返回值的实际数据类型与为 ANYELEMENT 输入参数提供的实际数据类型相同。