Snowflake Python Pandas 连接器 - 使用 fetch_pandas_all 的未知错误
Posted
技术标签:
【中文标题】Snowflake Python Pandas 连接器 - 使用 fetch_pandas_all 的未知错误【英文标题】:Snowflake Python Pandas Connector - Unknown error using fetch_pandas_all 【发布时间】:2020-06-17 22:43:28 【问题描述】:我正在尝试使用 python pandas 连接器连接到雪花。
我在 Windows 上使用 anaconda 发行版,但卸载了现有的连接器和 pyarrow 并使用此页面上的说明重新安装:https://docs.snowflake.com/en/user-guide/python-connector-pandas.html
我有以下版本
熊猫 1.0.4 py37h47e9c7a_0
点 20.1.1 py37_1
pyarrow 0.17.1 pypi_0 pypi
python 3.7.7 h81c818b_4
雪花连接器-python 2.2.7 pypi_0 pypi
运行本文档的第 2 步时:https://docs.snowflake.com/en/user-guide/python-connector-install.html,我得到:4.21.2
在尝试使用 fetch_pandas_all()
时出现错误:NotSupportedError: Unknown error
我使用的代码如下:
import snowflake.connector
import pandas as pd
SNOWFLAKE_DATA_SOURCE = '<DB>.<Schema>.<VIEW>'
query = '''
select *
from table(%s)
LIMIT 10;
'''
def create_snowflake_connection():
conn = snowflake.connector.connect(
user='MYUSERNAME',
account='MYACCOUNT',
authenticator = 'externalbrowser',
warehouse='<WH>',
database='<DB>',
role='<ROLE>',
schema='<SCHEMA>'
)
return conn
con = create_snowflake_connection()
cur = con.cursor()
temp = cur.execute(query, (SNOWFLAKE_DATA_SOURCE)).fetch_pandas_all()
cur.close()
我想知道我还需要安装/升级/检查什么才能让fetch_pandas_all()
工作?
编辑:在下面发布答案后,我意识到问题出在 SSO(单点登录) 与 authenticationator='externalbrowser'。使用独立帐户时,我可以获取。
【问题讨论】:
您看过 Snowflake 文档中的示例了吗? docs.snowflake.com/en/user-guide/…这可能只是查询字符串的格式问题。 是的,同样的错误。 运行show parameters like '%python_connector_query_result_format%'
返回值Arrow,ROWS_PER_RESULTSET为0。
为了排除受 Anaconda 影响的包和环境,您是否尝试使用通过 pip3
直接安装的库(在 anaconda 之外)?
【参考方案1】:
我找到了一种解决方法,通过依赖 fetchall() 而不是 fetch_all_pandas() 来避免 SSO 错误:
try:
cur.execute(sql)
all_rows = cur.fetchall()
num_fields = len(cur.description)
field_names = [i[0] for i in cur.description]
finally:
cur.close()
con.close()
df = pd.DataFrame(all_rows)
df.columns = field_names
【讨论】:
【参考方案2】:运行此代码时会发生什么?
from snowflake import connector
import time
import logging
for logger_name in ['snowflake.connector', 'botocore', 'boto3']:
logger = logging.getLogger(logger_name)
logger.setLevel(logging.DEBUG)
ch = logging.FileHandler('test.log')
ch.setLevel(logging.DEBUG)
ch.setFormatter(logging.Formatter('%(asctime)s - %(threadName)s %(filename)s:%(lineno)d - %(funcName)s() - %(levelname)s - %(message)s'))
logger.addHandler(ch)
from snowflake.connector.cursor import CAN_USE_ARROW_RESULT
import pyarrow
import pandas as pd
print('CAN_USE_ARROW_RESULT', CAN_USE_ARROW_RESULT)
这将输出 CAN_USE_ARROW_RESULT 是否为真,如果不为真,则 pandas 将无法工作。当您进行 pip 安装时,您运行了哪些?
pip install snowflake-connector-python pip install snowflake-connector-python[pandas]
另外,你在什么操作系统上运行?
【讨论】:
感谢您的帮助。CAN_USE_ARROW_RESULT
返回 True。我使用以下安装:pip install snowflake-connector-python[pandas]。操作系统是:Windows 10 Pro。
我已经在 Windows 上测试了同样的问题。显然它不适用于 Windows。【参考方案3】:
我现在有这个工作,但不确定哪个部分有帮助 - 采取了以下步骤:
-
根据@Kirby 的评论,我尝试了
pip3 install --upgrade snowflake-connector-python
.. 这是基于历史截图.. 我应该在括号中加上[pandas],即pip3 install --upgrade snowflake-connector-python[pandas]
,但无论如何,我收到以下错误消息:
错误:需要 Microsoft Visual C++ 14.0。使用“Visual Studio 构建工具”获取它:https://visualstudio.microsoft.com/downloads
因此我下载了(确切的文件名:vs_buildtools__121011638.1587963829.exe)并安装了 VS Build Tools。
这是棘手的部分。我随后获得了对我的机器的管理员访问权限(因此希望是 Visual Studio 构建工具提供帮助,而不是管理员访问权限)
然后我按照最初提到的雪花文档Python Connector API 说明进行操作:
一个。 Anaconda 提示(以 admin 身份打开):pip install snowflake-connector-python[pandas]
b.蟒蛇:
import snowflake.connector
import pandas as pd
ctx = snowflake.connector.connect(
user=user,
account=account,
password= 'password',
warehouse=warehouse,
database=database,
role = role,
schema=schema)
# Create a cursor object.
cur = ctx.cursor()
# Execute a statement that will generate a result set.
sql = "select * from t"
cur.execute(sql)
# Fetch the result set from the cursor and deliver it as the Pandas DataFrame.
df = cur.fetch_pandas_all()
编辑我意识到在使用我的 Okta(单点登录)帐户时执行 df = cur.fetch_pandas_all()
时仍然出现错误,即当我使用我的用户名和身份验证器 = 'externalbrowser' 时。当我使用其他帐户时,我不再收到错误消息(使用密码)。
注意:我仍然能够连接外部浏览器(并且我看到查询已在 Snowflake 历史记录中成功执行);我只是无法获取。
【讨论】:
根据此处和有问题的编辑;使用 SSO 时问题仍然存在。使用 SSO,我能够成功执行查询,但不能获取到 Python。使用独立帐户,我可以使用fetch_pandas_all()
成功将数据提取到 Python
以上有什么解决办法吗?使用 SSO 获取数据以上是关于Snowflake Python Pandas 连接器 - 使用 fetch_pandas_all 的未知错误的主要内容,如果未能解决你的问题,请参考以下文章
使用 SSO 和基于浏览器的登录从 Python 连接到 Snowflake
将数据从 Pandas 存储到 Snowflake 的最佳方式
如何使用 Snowflake sql 查询的结果填充 pandas DataFrame?