雪花熊猫 pd_writer 写出带有 NULL 的表

Cod*_*les 6 python sqlalchemy dataframe pandas snowflake-cloud-data-platform

我有一个 Pandas 数据框,我正在使用 SQLAlchemy 引擎和to_sql函数将它写到 Snowflake 。它工作正常,但chunksize由于某些雪花限制,我必须使用该选项。这对于较小的数据帧也很好。但是,某些数据帧有 500k+ 行,并且每块 15k 记录,完成写入 Snowflake 需要很长时间。

我做了一些研究,发现pd_writer了 Snowflake 提供的方法,它显然可以更快地加载数据帧。我的 Python 脚本完成得更快,我看到它创建了一个包含所有正确列和正确行数的表,但每一行中每一列的值都是 NULL。

我认为这是一个NaNNULL发行及想尽一切可能取代NaN以s None,而它确实在数据帧中的替代品,通过它获取表的时候,一切都变得NULL。

我如何才能pd_writer将这些巨大的数据帧正确写入 Snowflake?有没有可行的替代方案?

编辑:按照克里斯的回答,我决定尝试使用官方示例。这是我的代码和结果集:

import os
import pandas as pd
from snowflake.sqlalchemy import URL
from sqlalchemy import create_engine
from snowflake.connector.pandas_tools import write_pandas, pd_writer


def create_db_engine(db_name, schema_name):
    return create_engine(
        URL(
            account=os.environ.get("DB_ACCOUNT"),
            user=os.environ.get("DB_USERNAME"),
            password=os.environ.get("DB_PASSWORD"),
            database=db_name,
            schema=schema_name,
            warehouse=os.environ.get("DB_WAREHOUSE"),
            role=os.environ.get("DB_ROLE"),
        )
    )


def create_table(out_df, table_name, idx=False):
    engine = create_db_engine("dummy_db", "dummy_schema")
    connection = engine.connect()

    try:
        out_df.to_sql(
            table_name, connection, if_exists="append", index=idx, method=pd_writer
        )

    except ConnectionError:
        print("Unable to connect to database!")

    finally:
        connection.close()
        engine.dispose()

    return True


df = pd.DataFrame([("Mark", 10), ("Luke", 20)], columns=["name", "balance"])

print(df.head)

create_table(df, "dummy_demo_table")

Run Code Online (Sandbox Code Playgroud)

代码运行良好,没有任何问题,但是当我查看创建的表时,它全是 NULL。再次。

这就是 dummy_demo_table 向我展示的

Cod*_*les 17

事实证明,文档(可以说是 Snowflake 的最弱点)与现实不同步。这是真正的问题:https : //github.com/snowflakedb/snowflake-connector-python/issues/329。它所需要的只是列名中的一个字符为大写,它可以完美运行。

我的解决方法是简单地做:df.columns = map(str.upper, df.columns)在调用to_sql.