如何在AWS Athena中注册Lambda UDF,替代USING EXTERNAL FUNCTION语法?
USING EXTERNAL FUNCTION语法 问题分析
你尝试用CREATE OR REPLACE FUNCTION注册Lambda UDF时出现的错误,说明当前使用的SQL引擎(推测为Amazon Athena)不支持这种语法创建外部函数。该引擎的CREATE语句仅支持创建视图、物化视图等对象(如错误提示中列出的MATERIALIZED、VIEW等),不支持直接通过CREATE FUNCTION注册Lambda-backed UDF。
目前你能正常运行的USING EXTERNAL FUNCTION语法,是该引擎声明临时外部函数的唯一方式——这种函数仅在当前查询会话中生效,无法全局注册供所有用户直接调用。
解决方案(实现多用户简化使用)
虽然无法全局注册该函数,但可以通过以下方式让多用户无需重复编写USING EXTERNAL FUNCTION语句:
1. 创建封装函数调用的视图
创建一个视图,将函数声明和基础查询逻辑封装在一起,用户直接查询视图即可使用函数功能:
CREATE OR REPLACE VIEW gen_ai.review_with_ai AS USING EXTERNAL FUNCTION ai_func(review VARCHAR) RETURNS VARCHAR LAMBDA 'xxx-ai-xxx-genai-udf' SELECT review, ai_func(review) as ai_review from gen_ai.xxxxxxx_table;
用户只需执行SELECT * FROM gen_ai.review_with_ai;即可获取结果,无需关注函数声明部分。如果需要让函数能在任意查询中灵活使用,可以创建多个针对性视图覆盖不同场景。
2. 使用命名查询(Saved Queries)
将包含USING EXTERNAL FUNCTION的完整查询保存为命名查询(如Athena的Saved Queries功能),用户可以直接运行该查询,或者基于它修改查询逻辑,无需重复编写函数声明代码。
补充:如果使用Amazon Redshift
若你实际使用的是Redshift(你提到Redshift支持CREATE FUNCTION),可以使用以下正确语法注册Lambda-backed UDF:
CREATE OR REPLACE FUNCTION ai_func(review varchar) RETURNS VARCHAR STABLE LANGUAGE plpgsql AS $$ BEGIN RETURN aws_lambda.invoke( ARN => 'arn:aws:lambda:us-east-1:XXXXXXXXXX:function:xxx-ai-xxx-genai-udf', PAYLOAD => json_build_object('review', review)::text )::json->>'body'; END; $$;
注册完成后,所有有权限的用户都可以直接在查询中调用ai_func(review),无需额外声明。
内容的提问来源于stack exchange,提问作者Venkat Ankam

