如何在Snowflake中从一个Python UDF调用另一个Python UDF?
解决Snowflake Python UDF中调用其他UDF的问题
问题背景
你在Snowflake中创建了RETRIEVE_GCHAT_WEBHOOK_URL__BI_NOTIFICATION Python UDF,试图在另一个发送通知的UDFsend_gchat_message中直接调用它时触发NameError;尝试用Snowpark方式获取结果又遇到ModuleNotFoundError,以下是两种可行的解决办法:
方案一:将目标UDF结果作为参数传入(推荐)
Snowflake的Python UDF无法直接在内部调用其他UDF,最简洁的方式是把RETRIEVE_GCHAT_WEBHOOK_URL__BI_NOTIFICATION()的执行结果作为参数传递给发送消息的UDF:
USE WAREHOUSE BI_ELT_WH; USE DATABASE BI_ELT; USE SCHEMA INTEGRATIONS; CREATE OR REPLACE FUNCTION send_gchat_message(message string, webhook_url string) RETURNS STRING LANGUAGE PYTHON RUNTIME_VERSION = '3.8' PACKAGES = ('requests') HANDLER = 'send_gchat_message' AS $$ import requests def send_gchat_message(message, webhook_url): requests.post(webhook_url, json={'text': message}) return 'Done.' $$; -- 调用时传入目标UDF的执行结果 SELECT send_gchat_message('This is a test message!', RETRIEVE_GCHAT_WEBHOOK_URL__BI_NOTIFICATION());
方案二:在UDF内部通过Snowpark调用SQL(需添加依赖)
如果必须在UDF内部获取Webhook URL,需要添加snowflake-snowpark-python依赖包,通过活动会话执行SQL查询获取目标UDF的结果,注意要指定UDF的完整路径(数据库.模式.UDF名称):
USE WAREHOUSE BI_ELT_WH; USE DATABASE BI_ELT; USE SCHEMA INTEGRATIONS; CREATE OR REPLACE FUNCTION send_gchat_message(message string) RETURNS STRING LANGUAGE PYTHON RUNTIME_VERSION = '3.8' PACKAGES = ('requests', 'snowflake-snowpark-python') HANDLER = 'send_gchat_message' AS $$ import requests from snowflake.snowpark.context import get_active_session def send_gchat_message(message): session = get_active_session() # 执行SQL获取UDF结果,注意匹配UDF的实际大小写(Snowflake默认不区分大小写) query_result = session.sql("SELECT BI_ELT.INTEGRATIONS.RETRIEVE_GCHAT_WEBHOOK_URL__BI_NOTIFICATION()").collect() target_url = query_result[0][0] requests.post(target_url, json={'text': message}) return 'Done.' $$; SELECT send_gchat_message('This is a test message!');
注意事项
- 方案一无需额外依赖,性能更优,是首选方案。
- 方案二会引入Snowpark包,增加UDF的启动开销,仅适合必须在UDF内部获取URL的场景。
- 确保当前用户拥有调用
RETRIEVE_GCHAT_WEBHOOK_URL__BI_NOTIFICATIONUDF的权限。
内容的提问来源于stack exchange,提问作者Sebastian
相关产品推荐
相关产品推荐

