python - 将数据从 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 百万行。
解决方案
我能想象到的最不痛苦的方法是将文件转储到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 秒。
推荐阅读
- r - 用 NA 替换字符(0)
- homebrew - 在地窖中安装 Postgres 9.6
- mysql - Azure MySql 休息 API 。插入新的防火墙规则
- xamarin.forms - VS2017 15.7.3 不再打断点 Xamarin.Forms
- bash - 如何根据行文件的随机列表从文件中删除行
- python - Tensorflow while_loop 帧连接
- kotlin - 如何压缩列表
在 Kotlin 中使用 RxJava2? - python - Python; Instagram API,获取用户提要
- excel - 在 Excel 文本导入向导中指定新行?
- python-3.x - 在 Postgresql 中一次将数千行插入数据库