使用Snowflake Python Connector拉取数据报250003错误如何解决?
问题复现
通过Snowflake Python Connector搭建Python从Snowflake数据库拉取数据的流程,编写的拉取方法如下:
import snowflake.connector def request_data(s, query): snowflake_connection = snowflake.connector.connect(user = 'user', password = 'password', account = 'account', warehouse = 'warehouse', database = 'database', schema = s) try: with snowflake_connection.cursor() as cursor: cursor.execute(query) data = cursor.fetch_pandas_all() finally: snowflake_connection.close() return data
小数据量请求可正常运行,示例如下:
query = "select * from books.sales where date between '2020-08-01' and '2020-11-31'" sales = request_data('BOOKS', query)
扩大日期范围拉取约39000行数据时,抛出如下错误:
250003: Failed to get the response. Hanging? method: get, url: <snowflake url>
测试确认SQL执行正常,问题出在结果拉取阶段,缩小行数到10000以内仍然报错,不需要拆分多次请求的前提下可通过如下方案解决。
原因分析
- 该报错本质是请求超时,并非10000行的单次拉取上限限制:Snowflake Python Connector的10000行限制是默认单次批量拉取的行数,不是总拉取上限,默认会自动分批拉取直到拿完全量结果
- 触发超时的常见原因:默认请求超时时间过短、长时间拉取时会话被断开、网络波动导致校验失败、连接器版本存在已知Bug
解决方案
方法1:调整连接器核心参数(优先测试)
在连接配置中新增会话保活、超时调整、批量拉取行数配置,无需拆分请求即可直接拉取全量39000行数据,修改后的代码如下:
import snowflake.connector def request_data(s, query): snowflake_connection = snowflake.connector.connect( user = 'user', password = 'password', account = 'account', warehouse = 'warehouse', database = 'database', schema = s, client_session_keep_alive = True, # 保持会话活跃,避免长时间拉取时连接被断开 connection_timeout = 300, # 连接超时时间设为5分钟,可根据数据量按需调大 client_compress = True, # 开启传输压缩,减少数据传输耗时 ocsp_fail_open = False # 关闭OCSP校验,避免网络波动导致的校验超时 ) try: with snowflake_connection.cursor() as cursor: cursor.arraysize = 100000 # 单批拉取上限调整为10万行,覆盖3.9万行需求实现单次拉取 cursor.execute(query) data = cursor.fetch_pandas_all() finally: snowflake_connection.close() return data
方法2:升级连接器版本
旧版本Snowflake Python Connector存在结果拉取超时的已知Bug,直接升级到最新版本即可解决:
pip install --upgrade snowflake-connector-python
内容的提问来源于stack exchange,提问作者Ehren
相关产品推荐
相关产品推荐

