创建标量 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 时,以下步骤将在运行时发生。
-
函数将输入参数转换为 Python 数据类型。
有关 Amazon Redshift 数据类型到 Python 数据类型的映射,请参阅Python UDF 数据类型。
-
函数执行 Python 程序,并传递转换后的输入参数。
-
Python 代码返回一个值。返回值的数据类型必须对应于函数定义所指定的 RETURNS 数据类型。
-
函数将 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 输入参数提供的实际数据类型相同。