web-dev-qa-db-ja.com

PandasからSnowflakeへのデータを保存する最適な方法

データフレームは巨大です(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万のサイズです行。

6
abdthe1

Ilja-everilaが指摘した最適な方法は、「コピーイン...」です。SFでは、変換前にcsvをクラウドにステージングする必要がありました。私はそれを行うのをためらっていましたが、パフォーマンスが650万レコードの場合は5〜10分。

1
abdthe1

私が想像できる最も苦痛の少ない方法は、ファイルを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秒かかりました。

1
Karl Anka

sQLAlchemyを使用するために、接続パラメーターに、データをバインドするparamstyle=qmarkを追加することもできます。これもここで参照されます: https://github.com/snowflakedb/snowflake-connector-python/issues/37#issuecomment-365503841

この変更後、適切と思われる場合は、SQLAlchemyアプローチとバルクロードアプローチのパフォーマンス比較を行って、大きなDFをファイルに書き込み、COPYINTOを使用してファイルをロードすることをお勧めします。 Snowflakeテーブルにファイルします。

0
Seeling Cheung