使用Snowpark的collect_nowait()遇错误:未用存储过程却提示不支持异步查询
问题分析与解决方案
问题原因
你遇到的错误本质是:Snowflake服务器端的Snowpark会话不支持异步查询操作。虽然你没显式编写存储过程,但如果你的main函数是作为Snowflake存储过程、任务或者UDF部署运行的,代码会在Snowflake服务器端执行,此时会话环境默认禁用异步操作,不管是collect_nowait()还是collect(block=False)都会触发这个错误。
解决方案
直接改用同步的collect()方法执行查询,同时可以优化DataFrame的遍历方式:
import snowflake.snowpark as snowpark def main(session: snowpark.Session): tableName = 'DB.SCHEMA.DDL_TABLE' query_table = session.table(tableName) df = query_table.toPandas() # 优化遍历方式,直接迭代DataFrame的行 for _, row in df.iterrows(): command = row["DDL"] # 使用同步collect()执行 session.sql(command).collect() return 'Done'
额外说明
如果你的代码是在本地客户端运行(而非部署到Snowflake内部),异步操作应该可以正常工作。但如果是在Snowflake服务器端执行(比如通过任务调度、存储过程调用),必须使用同步执行方式,因为服务器端会话不支持异步查询的特性。
内容的提问来源于stack exchange,提问作者Justine
相关产品推荐
相关产品推荐

