首页 > 解决方案 > 将数据从 Pandas 存储到 Snowflake 的最佳方式

问题描述

数据框很大(7-8 百万行)。尝试使用 chunksize = 5000 的 to_sql 但它从未完成。

使用,

from sqlalchemy import create_engine
from snowflake.sqlalchemy import URL

df.to_sql(snowflake_table , engine, if_exists='replace', index=False, index_label=None, chunksize=20000)

从 Pandas DF 将数据存储到 SF 的其他最佳解决方案是什么?或者我在这里做错了什么?DF 通常大小为 7-10 百万行。

标签: pythonpandasdataframesqlalchemysnowflake-cloud-data-platform

解决方案


我能想象到的最不痛苦的方法是将文件转储到SnowpipeS3并自动将其加载到 Snowflake 中。通过该设置,您根本不必执行任何复制命令或进行任何 Snowflake 调用。

有关如何为 S3 设置Snowpipe 的详细信息,请参阅 Snowflake 文档。简而言之,您需要创建一个阶段、一个目标表、一个文件格式(我想您已经准备好这些东西了)和一个管道。然后为您的存储桶设置管道将侦听的 SQS 通知。

Snowflake 建议文件大小约为 10-100 MB,因此拆分文件可能是个好主意。

# set up credentials (s3fs is built on BOTO hence this is AWS specific)
fs = s3fs.S3FileSystem(key=key, secret=secret)

# number of files to split into
n_chunks = 2

# loop over dataframe and dump chunk by chunk to S3
# (you likely want to expand file naming logic to avoid overwriting existing files)
for f_name, chunks in enumerate(np.array_split(np.arange(df.shape[0]), n_chunks)):
    bytes_to_write = df.iloc[chunks].to_csv(index=False).encode()
    with fs.open('s3://mybucket/test/dummy_{}.csv'.format(f_name), 'wb') as f:
        f.write(bytes_to_write)

作为参考,我尝试了一个 7M 行数据框,该数据框分为 5 个大约 40 MB 的文件。从开始拆分数据帧到所有行都到达 Snowflake 大约需要 3 分 40 秒。


推荐阅读