Snowpark Python代码在Snowflake中手动临时运行时如何获取用户输入
Snowpark Python代码在Snowflake中手动临时运行时如何获取用户输入
嗨,我完全懂你遇到的问题——在Snowflake里跑Snowpark Python代码时,手动临时执行需要用户输入参数,但用input()根本不管用,代码还一直卡着。毕竟Snowflake的Python运行环境不是交互式的,这和你之前用Databricks widgets的场景不太一样。下面给你两个靠谱的解决方案:
方案1:用存储过程的输入参数(推荐)
这是Snowflake里最常用的参数传递方式,把你的Snowpark代码封装成带默认值的存储过程,手动调用时传指定参数,调度运行时用默认逻辑自动计算日期。
举个具体的实现例子:
CREATE OR REPLACE PROCEDURE run_adhoc_job(start_date STRING DEFAULT NULL, end_date STRING DEFAULT NULL) RETURNS STRING LANGUAGE PYTHON RUNTIME_VERSION = '3.10' PACKAGES = ('snowflake-snowpark-python') HANDLER = 'main' AS $$ from snowflake.snowpark import Session from datetime import datetime, timedelta def main(session: Session, start_date: str, end_date: str): # 处理日期逻辑:没传参数就用默认规则计算 if not start_date: start_date = (datetime.now() - timedelta(days=2)).strftime('%Y-%m-%d') if not end_date: end_date = (datetime.now() - timedelta(days=1)).strftime('%Y-%m-%d') # 这里替换成你的实际业务逻辑,比如用日期过滤数据 session.sql(f"SELECT * FROM your_target_table WHERE date_column BETWEEN '{start_date}' AND '{end_date}'").show() return f"任务执行完成!日期范围:{start_date} 至 {end_date}" $$;
- 手动临时运行:直接传指定日期参数调用
CALL run_adhoc_job('2024-12-01', '2024-12-02');
- 调度自动运行:不传参数,代码自动用默认逻辑计算日期
CALL run_adhoc_job();
这个方案完全适配Snowflake的运行模式,不管手动还是调度都能无缝切换,而且从根本上解决了input()的问题——因为Snowflake的Python runtime是非交互式的,没有终端接收输入,所以input()会一直阻塞等待,导致代码无限运行。
方案2:用Snowflake Streamlit(可视化输入界面)
如果想要更友好的用户输入体验,比如可视化日期选择器,可以用Snowflake集成的Streamlit做一个简单的Web界面,让用户直观输入参数后触发代码执行。
示例代码如下:
import streamlit as st from snowflake.snowpark import Session from datetime import datetime, timedelta # 自动建立Snowpark会话(利用Snowflake内置认证) session = Session.builder.getOrCreate() st.title("临时任务运行器") # 设置默认日期,和你的业务逻辑一致 default_start_date = datetime.now() - timedelta(days=2) default_end_date = datetime.now() - timedelta(days=1) # 生成日期输入组件 start_date = st.date_input("开始日期", value=default_start_date) end_date = st.date_input("结束日期", value=default_end_date) if st.button("执行任务"): # 转换日期格式为Snowflake兼容的字符串 start_str = start_date.strftime('%Y-%m-%d') end_str = end_date.strftime('%Y-%m-%d') # 执行你的业务逻辑 query_result = session.sql(f"SELECT * FROM your_target_table WHERE date_column BETWEEN '{start_str}' AND '{end_str}'").collect() st.success(f"任务执行成功!共获取 {len(query_result)} 条数据") st.dataframe(query_result)
把这个代码部署到Snowflake Streamlit后,用户打开界面就能选择日期,点击按钮直接触发运行,非常适合需要可视化操作的场景。
备注:内容来源于stack exchange,提问作者rainingdistros
相关产品推荐
相关产品推荐

