データフレームは巨大です(700万から800万行)。チャンクサイズ= 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は通常700万から1000万のサイズです行。
Ilja-everilaが指摘した最適な方法は、「コピーイン...」です。SFでは、変換前にcsvをクラウドにステージングする必要がありました。私はそれを行うのをためらっていましたが、パフォーマンスが650万レコードの場合は5〜10分。
私が想像できる最も苦痛の少ない方法は、ファイルをS3
にダンプし、 Snowpipe をSnowflakeに自動的にロードすることです。この設定では、コピーコマンドを実行したり、スノーフレークを呼び出したりする必要はまったくありません。
設定方法の詳細については、Snowflakeのドキュメントを参照してください S3のSnowpipe 。つまり、ステージ、ターゲットテーブル、ファイル形式(ただし、これらはすでに配置されていると思います)、およびパイプを作成する必要があります。次に、パイプがリッスンするバケットの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行のデータフレームを約40MBの5つのファイルに分割してこれを試しました。データフレームの分割を開始してからすべての行がスノーフレークに到着するまで、約3分40秒かかりました。
sQLAlchemyを使用するために、接続パラメーターに、データをバインドするparamstyle=qmark
を追加することもできます。これもここで参照されます: https://github.com/snowflakedb/snowflake-connector-python/issues/37#issuecomment-365503841
この変更後、適切と思われる場合は、SQLAlchemyアプローチとバルクロードアプローチのパフォーマンス比較を行って、大きなDFをファイルに書き込み、COPYINTOを使用してファイルをロードすることをお勧めします。 Snowflakeテーブルにファイルします。