将数据从 Pandas 存储到 Snowflake 的最佳方式
Posted
技术标签:
【中文标题】将数据从 Pandas 存储到 Snowflake 的最佳方式【英文标题】:Optimal way to store data from Pandas to Snowflake 【发布时间】:2019-01-15 15:47:39 【问题描述】:数据框很大(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 百万行。
【问题讨论】:
如果可能,可以尝试存储在 NoSQL DB 中。对于这种大小,应该比 SQL 工作得更好。 不幸的是,这不是一个选项,存储到 NoSQL DB 对 Snowflake 不太熟悉(一点也不),但 COPY INTO 似乎是完成这项工作的工具。将数据框以某种(半)结构化格式保存在合适的暂存位置并复制。 我也在考虑这个选项。转换为 CSV 并使用复制到。 【参考方案1】:我能想象的最不痛苦的方法是将文件转储到S3
并让Snowpipe 自动将其加载到雪花中。通过该设置,您根本不必执行任何复制命令或进行任何 Snowflake 调用。
有关如何设置 Snowpipe for S3 的详细信息,请参阅 Snowflake 文档。简而言之,您需要创建一个阶段、一个目标表、一个文件格式(我想您已经准备好这些东西了)和一个管道。然后为您的存储桶设置管道将侦听的 SQS 通知。
Snowflake suggests 的文件大小约为 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 秒。
【讨论】:
【参考方案2】:ilja-everila 指出的最佳方式是“复制到...”,因为 SF 要求在转换之前将 csv 暂存到云上,我犹豫不决,但似乎这是唯一的选择,因为650 万条记录的性能在 5-10 分钟内完成。
【讨论】:
【参考方案3】:对于使用SQLAlchemy,您是否还可以在连接参数中添加绑定数据的paramstyle=qmark
。这也在这里引用:https://github.com/snowflakedb/snowflake-connector-python/issues/37#issuecomment-365503841
在此更改之后,如果您觉得合适,最好在 SQLAlchemy 方法和将大 DF 写入文件的批量加载方法之间进行性能比较,并使用 COPY INTO 将文件加载到 Snowflake 表中。
【讨论】:
张思玲。谢谢您的回答。不幸的是,它在性能方面没有任何改善,查询一直运行超过 45 分钟,然后我取消了它,因为 csv 到 SF 的传输不到 10 分钟。【参考方案4】:pandas 在后台使用多个值执行“插入...”。 Snowflake 的摄取记录最多为 16384 条。请更改您的 chunksize=16384。
【讨论】:
以上是关于将数据从 Pandas 存储到 Snowflake 的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章
Snowflake pandas pd_writer 用 NULL 写出表