创建标量 Lambda UDF - Amazon Redshift
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

创建标量 Lambda UDF

Amazon Redshift 可以使用 AWS Lambda 中定义的自定义函数作为 SQL 查询的一部分。您可以使用 Lambda 支持的任何编程语言编写标量 UDFs Lambda,例如 Java、Go、PowerShell、Node.js、C#、Python 和 Ruby。或者,您可以使用自定义运行时。

Lambda UDFs 在 Lambda 中定义和管理,您可以控制在 UDFs 中调用这些 Amazon Redshift 的访问权限。您可以在同一个查询中调用多个 Lambda 函数,也可以多次调用同一个函数。

在支持标量函数的 SQL 语句的任何子句中使用 Lambda UDFs。您还可以在任何 SQL 语句(如 SELECT、UPDATE、INSERT 或 DELETE)中使用 Lambda UDFs。

注意

使用 Lambda UDFs 可能会从 Lambda 服务产生额外费用。是否这样做取决于 Lambda 请求(UDF 调用)的数量和 Lambda 程序执行的总持续时间等因素。但是,在 Lambda 中使用 UDFs Amazon Redshift 不会产生额外费用。有关 AWS Lambda 定价的信息,请参阅 AWS Lambda 定价

请求数因使用 Lambda UDF 的特定 SQL 语句子句而异。Lambda例如,假设函数在 WHERE 子句中使用,如下所示。

SELECT a, b FROM t1 WHERE lambda_multiply(a, b) = 64; SELECT a, b FROM t1 WHERE a*b = lambda_multiply(2, 32)

在这种情况下,Amazon Redshift 为每个对象调用第一个 SELECT 语句并仅调用第二个 SELECT 语句一次。

但是,在查询的投影部分中使用 UDF 时,只能为结果集中的每个限定或聚合行调用 Lambda 函数一次。您可以配置对 Lambda 函数进行多次调用的批处理,以提高性能并降低成本。

注册 Lambda UDF

命令创建以下参数:CREATE EXTERNAL FUNCTION (创建外部函数)

  • (可选)带数据类型的参数列表。

  • 一个返回数据类型。

  • 调用 Amazon Redshift 的外部函数的一个函数名称。

  • 授权 Amazon Redshift 集群代入并调用 Lambda 的一个 IAM 角色。

  • UDF 调用的一个 Lambda 函数名称。Lambda

有关 CREATE EXTERNAL FUNCTION 的信息,请参阅CREATE EXTERNAL FUNCTION (创建外部函数)

此函数的输入和返回数据类型可以是任何标准 Amazon Redshift 数据类型。

Amazon Redshift 确保外部函数可以发送和接收批处理参数和结果。

管理 Lambda UDF 安全性和权限

要创建 Lambda UDF,请确保您具有在 LANUGAGE EXFUNC 上使用的权限。您必须明确授予 USAGE ON LANGUAGE EXFUNC 权限或撤销 USAGE ON LANGUAGE EXFUNC 权限才能指定用户、组或公共用户。

以下示例将 EXFUNC 上的使用权限授予 PUBLIC。

grant usage on language exfunc to PUBLIC;

以下示例从 PUBLIC 撤销 exfunc 上的使用权限,然后向用户组 lambda_udf_devs 授予使用权限。

revoke usage on language exfunc from PUBLIC; grant usage on language exfunc to group lambda_udf_devs;

要运行 Lambda UDF,请确保您拥有每个调用函数的权限。默认情况下,向 PUBLIC 授予运行新 Lambda UDFs 的权限。要限制使用,请从 PUBLIC 撤销该函数的此权限。然后,向特定用户或组授予权限。

以下示例从 PUBLIC 撤销对函数 exfunc_sum 的执行权限。然后,它会向用户组 lambda_udf_devs 授予使用权限。

revoke execute on function exfunc_sum(int, int) from PUBLIC; grant execute on function exfunc_sum(int, int) to group lambda_udf_devs;

默认情况下,超级用户拥有全部权限。

有关授予和撤销权限的更多信息,请参阅GRANTREVOKE

使用 Amazon Redshift 和 AWS Lambda 之间的 JSON 接口

Amazon Redshift 对 Lambda 与之通信的所有 Amazon Redshift 函数使用通用接口。

下表显示了您预期为 JSON 负载使用的指定 Lambda 函数的输入字段列表。

字段名称

Description

值范围
request_id 唯一标识每个调用请求的通用唯一标识符 (UUID)。

有效的 UUID。

集群

集群的完整 Amazon 资源名称 (ARN)。

有效的集群 ARN。

user

进行调用的用户的名称。 有效的用户名。

database

运行查询的数据库的名称。 有效的数据库名称。

external_function

发出调用的外部函数的完全限定名称。 有效的完全限定函数名称。

query_id

正在发出调用的查询的查询 ID。 有效的查询 ID。

num_records

负载中的参数数量。 值为 1 – 2^64。

参数

指定格式的数据负载。 数组格式的数据必须是 JSON 数组。每个元素都是一个记录,如果参数数大于 1,则会成为数组。通过使用数组,Amazon Redshift 将保留记录在负载中的顺序。

JSON 数组的顺序决定了批处理的顺序。函数必须以迭代方式在参数之前添加前缀并生成确切数量的记录。Lambda以下是负载的示例。

{ "request_id" : "23FF1F97-F28A-44AA-AB67-266ED976BF40", "cluster" : 'arn:aws:redshift:xxxx', "user" : "master", "database" : "db1", "external_function": "public.foo", "query_id" : 5678234, "num_records" : 4, "arguments" : [ [ 1, 2 ], [ 3, null], null, [ 4, 6] ] }

函数的返回输出包含以下字段。Lambda

字段名称

Description

值范围
success 函数成功或失败的指示。

值为 "true""false"

错误msg

如果成功值为 "false"(如果函数失败),则为错误消息;否则,将忽略此字段。

一条有效消息。

num_records

负载中的记录数。 值为 1 – 2^64。

结果

指定格式的调用结果。 不适用

以下是 Lambda 函数输出的示例。

{ "success": true, // true indicates the call succeeded "error_msg" : "my function isn't working", // shall only exist when success != true "num_records": 4, // number of records in this payload "results" : [ 1, 4, null, 7 ] }

当您从 SQL 查询调用 Lambda 函数时,Amazon Redshift 会确保连接的安全性,并注意以下事项:

  • GRANT 和 REVOKE 权限。有关 UDF 安全性和权限的更多信息,请参阅UDF 安全性和权限

  • Amazon Redshift 仅将最小数据集提交到指定的 Lambda 函数。

  • Amazon Redshift 仅调用具有指定 IAM 角色的指定 Lambda 函数。