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。
我认为这是一个NaN以NULL发行及想尽一切可能取代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。再次。
Cod*_*les 17
事实证明,文档(可以说是 Snowflake 的最弱点)与现实不同步。这是真正的问题:https : //github.com/snowflakedb/snowflake-connector-python/issues/329。它所需要的只是列名中的一个字符为大写,它可以完美运行。
我的解决方法是简单地做:df.columns = map(str.upper, df.columns)在调用to_sql.
| 归档时间: |
|
| 查看次数: |
2698 次 |
| 最近记录: |