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

无法使用Pyspark从EMR群集连接到Snowflake

将数据从 Pandas 存储到 Snowflake 的最佳方式

如何使用 Snowflake sql 查询的结果填充 pandas DataFrame?

Snowflake pandas pd_writer 用 NULL 写出表

AWS Lambda Snowflake Python 连接器在尝试连接时挂起