Snowflake Python Worksheet中Main Handler带额外参数的部署问题
Snowpark Python Worksheet及存储过程接收自定义参数的正确实现方式
问题场景
开发部署可接收用户输入的Snowpark代码至Python Worksheet时,尝试给main函数添加自定义参数:
import snowflake.snowpark as snowpark def main(session: snowpark.Session, param): df = session.table('snowflake_sample_data.tpch_sf10.lineitem').limit(param) return df
触发报错:
**Handler参数数量超出预期。**函数签名必须仅包含一个参数:
def main(session: snowpark.Session):
同时将代码部署为存储过程时,出现报错:
无法创建存储过程my_proc。
执行查询失败:Python函数定义包含2个参数(含session),但存储过程定义包含0个参数。函数MY_PROC的处理程序main的Python函数参数应为session和存储过程定义的参数
解决方案
一、Python Worksheet中接收用户输入
Python Worksheet的main函数仅支持session这一个固定参数,无法直接添加自定义参数。需通过session.get_parameter()读取工作表配置的参数:
示例代码:
import snowflake.snowpark as snowpark def main(session: snowpark.Session): # 读取参数,第二个参数为默认值(需转为对应数据类型) param = int(session.get_parameter('LIMIT_PARAM', '10')) df = session.table('snowflake_sample_data.tpch_sf10.lineitem').limit(param) return df
操作说明:在Python Worksheet界面打开「参数」面板,添加键为LIMIT_PARAM的参数并设置对应数值即可。
二、部署为带参数的存储过程
创建存储过程时,必须在SQL语句中明确定义参数,且Pythonmain函数的参数(除session外)需与存储过程参数一一对应:
1. 编写带参数的Python函数
import snowflake.snowpark as snowpark def main(session: snowpark.Session, param: int): df = session.table('snowflake_sample_data.tpch_sf10.lineitem').limit(param) return df
2. 执行创建存储过程的SQL
CREATE OR REPLACE PROCEDURE my_proc(param INT) RETURNS TABLE( L_ORDERKEY NUMBER(38,0), L_PARTKEY NUMBER(38,0), L_SUPPKEY NUMBER(38,0), L_LINENUMBER NUMBER(38,0), L_QUANTITY NUMBER(12,2), L_EXTENDEDPRICE NUMBER(12,2), L_DISCOUNT NUMBER(12,2), L_TAX NUMBER(12,2), L_RETURNFLAG CHAR(1), L_LINESTATUS CHAR(1), L_SHIPDATE DATE, L_COMMITDATE DATE, L_RECEIPTDATE DATE, L_SHIPINSTRUCT CHAR(25), L_SHIPMODE CHAR(10), L_COMMENT VARCHAR(44) ) LANGUAGE PYTHON RUNTIME_VERSION = '3.10' PACKAGES = ('snowflake-snowpark-python') HANDLER = 'main';
3. 调用存储过程
CALL my_proc(50);
内容的提问来源于stack exchange,提问作者Lukasz Szozda
相关产品推荐
相关产品推荐

