数百万のレコードを挿入する最も効率的な方法は、SparkデータフレームからPostgresテーブルに5,000万を挿入することです。私もこれまで成功したバルクコピーとバッチサイズオプションを利用して、これをSparkから MSSQLまで実現しました。
Postgresのためにここにあることができる同様のものはありますか?
私が試したコードとプロセスの実行にかかった時間を追加します:
def inserter():
start = timer()
sql_res.write.format("jdbc").option("numPartitions","5").option("batchsize","200000")\
.option("url", "jdbc:postgresql://xyz.com:5435/abc_db") \
.option("dbtable", "public.full_load").option("user", "root").option("password", "password").save()
end = timer()
print(timedelta(seconds=end-start))
inserter()
したがって、1000万レコードに対して上記のアプローチを実行しnumPartitions
、で指定されているように5つの並列接続があり、バッチサイズを200kにしてみました。
プロセスにかかった合計時間は0:14:05.760926(14分5秒)でした。
時間を短縮する他の効率的なアプローチはありますか?
私が使用できる効率的または最適なバッチサイズは何ですか?バッチサイズを大きくすると、作業が速くなりますか?または、複数の接続を開く、つまり5を超えると、プロセスが速くなりますか?
上千万レコードの平均14分悪くないですが、ヘルプにこの質問に答える前にこれをやっているだろうそこに人を探しています。