将 pandas DataFrames 与 Python Connector 结合使用

pandas 是一个用于数据分析的库。借助 pandas,您可以使用名为 DataFrame 的数据结构来分析和处理二维数据(例如来自数据库表的数据)。

如果您需要将数据从 Snowflake 数据库获取到 pandas DataFrame,您可以使用 Snowflake Connector for Python 提供的 API 方法。该连接器还提供用于将数据从 pandas DataFrame 写入到 Snowflake 数据库的 API 方法。

备注

其中一些 API 方法需要特定版本的 PyArrow 库。有关详细信息,请参阅 要求

本主题内容:

要求

目前,Python Connector API 中面向 pandas 的 API 方法适用于:

  • Snowflake Connector 2.1.2 for Python(或更高版本)。

  • PyArrow 库版本 3.0.x。

    如果您尚未安装 PyArrow,则无需自己安装 PyArrow ;按照以下说明安装 Python Connector 时会自动安装相应版本的 PyArrow。

    小心

    如果您已经有上面所列推荐版本之外的任何 PyArrow 版本,请在安装 Snowflake Connector for Python 之前卸载 PyArrow。在安装 Snowflake Connector for Python 之后,请勿重新安装其他版本的 PyArrow。

  • pandas 0.25.2(或更高版本)。早期版本可能有效,但尚未经过测试。

安装

要安装与 pandas 兼容的 Snowflake Connector for Python 版本,请执行以下命令:

pip install "snowflake-connector-python[pandas]"
Copy

必须输入方括号([]),如命令中所示。方括号指定需要安装的软件包的额外部分。

将包的名称放在引号内(如图所示),以防止系统将方括号解释为通配符。

如果您需要安装其他额外部分(例如, secure-local-storage,用于 缓存与基于浏览器的 SSO 的连接,或者 缓存 MFA 令牌),请在额外部分之间使用逗号:

pip install "snowflake-connector-python[secure-local-storage,pandas]"
Copy

将数据从 Snowflake 数据库读取到 pandas DataFrame

要将数据读取到 pandas DataFrame,您可以使用 游标检索数据,然后调用以下其中一种 Cursor 方法以将数据放入 pandas DataFrame:

将数据从 pandas DataFrame 写入 Snowflake 数据库

要将数据从 pandas DataFrame 写入 Snowflake 数据库,请执行以下其中 一项 操作:

  • 调用 write_pandas() 函数。

  • 调用 pandas.DataFrame.to_sql() 方法。

    有关更多信息,请参阅 ` pandas.DataFrame.to_sql <https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_sql.html (https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_sql.html)>`_ 文档,并指定 pd_writer() 作为将数据插入数据库的方法。

从 Snowflake 到 pandas 的数据映射

下表显示从 Snowflake 数据类型到 pandas 数据类型的映射:

Snowflake 数据类型

pandas 数据类型

FIXED NUMERIC 类型(标度 = 0),DECIMAL 除外

(u)int{8,16,32,64}float64 (适用于 NULL)

FIXED NUMERIC 类型(标度 > 0),DECIMAL 除外

float64

FIXED NUMERIC 类型 DECIMAL

decimal

FLOAT/DOUBLE

float64

VARCHAR

str

BINARY

str

VARIANT

str

DATE

object (带 datetime.date 对象)

TIME

pandas.Timestamp(np.datetime64[ns])

TIMESTAMP_NTZ、TIMESTAMP_LTZ、TIMESTAMP_TZ

pandas.Timestamp(np.datetime64[ns])

备注:

  • 如果 Snowflake 数据类型为 FIXED NUMERIC,且标度为零,并且值为 NULL,则该值将转换为 float64,而不是整数类型。

  • 如果任何转换导致溢出,则 Python Connector 会引发异常。

导入 pandas

通常,pandas 由以下语句导入:

import pandas as pd
Copy

您可能会看到对 pandas 对象的引用为 pd.objectpandas.object

迁移到 pandas DataFrames

本部分主要适用于以前使用过 pandas(可能还有 SQLAlchemy)的用户。

以前的 pandas 用户可能具有类似如下的代码:

  • 此示例演示从 Python Connector 生成 pandas DataFrame 的原始方法:

    import pandas as pd
    
    def fetch_pandas_old(cur, sql):
        cur.execute(sql)
        rows = 0
        while True:
            dat = cur.fetchmany(50000)
            if not dat:
                break
            df = pd.DataFrame(dat, columns=cur.description)
            rows += df.shape[0]
        print(rows)
    
    Copy
  • 此示例演示如何使用 SQLAlchemy 生成 pandas DataFrame:

    import pandas as pd
    
    def fetch_pandas_sqlalchemy(sql):
        rows = 0
        for chunk in pd.read_sql_query(sql, engine, chunksize=50000):
            rows += chunk.shape[0]
        print(rows)
    
    Copy

与前面任一示例相似的代码均可转换,以使用 Python Connector ` 将数据从 Snowflake 数据库读取到 pandas DataFrame`_ (本主题内容)中列出的 Python Connector pandas API 调用。

备注

由于 Python Connector 中支持 pandas,因此不再需要 SQLAlchemy,即可将游标中的数据转换为 DataFrame。

但是,您可以根据需要继续使用 SQLAlchemy ;Python Connector 保持与 SQLAlchemy 的兼容性。

语言: 中文