数据框很大(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到1000万行。
答案 0 :(得分:1)
ilja-everila指出的最佳方法是“复制到...”,因为SF要求在转换之前将csv暂存在云上,我对此犹豫不决,但是鉴于这是唯一的选择650万条记录的播放时间为5-10分钟。
答案 1 :(得分:0)
要使用SQLAlchemy,是否还可以在连接参数中添加绑定数据的paramstyle=qmark
。这里也引用了此:https://github.com/snowflakedb/snowflake-connector-python/issues/37#issuecomment-365503841
进行此更改之后,如果您觉得合适,最好在SQLAlchemy方法和将大型DF写入文件并使用COPY INTO将文件加载到Snowflake表中的批量加载方法之间进行性能比较。
答案 2 :(得分:0)
我能想到的最痛苦的方法是将文件转储到S3
并让Snowpipe自动将其加载到Snowflake中。有了该设置,您根本不必执行任何复制命令或进行任何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秒。
答案 3 :(得分:0)
pandas在幕后使用多个值进行“插入...”。雪花最多只能记录16384条记录。请更改您的chunksize = 16384。