将数据从熊猫存储到雪花的最佳方法

时间:2018-08-08 11:31:48

标签: python pandas dataframe sqlalchemy snowflake-datawarehouse

数据框很大(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万行。

4 个答案:

答案 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。