Qual seria a maneira mais eficiente de inserir milhões de registros, digamos 50 milhões, de um dataframe Spark para o Postgres Tables. Eu fiz isso do spark ao MSSQL no passado, usando a opção de cópia em massa e tamanho do lote, que também teve êxito.
Existe algo semelhante que pode estar aqui para o Postgres?
Adicionando o código que tentei e o tempo que levou para executar o processo:
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()
Então, eu fiz a abordagem acima para 10 milhões de registros e tive 5 conexões paralelas, conforme especificado numPartitions
e também tentei o tamanho do lote de 200k .
O tempo total que levou para o processo foi 0: 14: 05.760926 (catorze minutos e cinco segundos).
Existe alguma outra abordagem eficiente que reduza o tempo?
Qual seria o tamanho do lote eficiente ou ideal que posso usar? Aumentar o tamanho do meu lote fará o trabalho mais rápido? Ou abrir várias conexões, ou seja,> 5 me ajudar a tornar o processo mais rápido?
Em média, 14 minutos para 10 milhões de registros não é ruim , mas procurar pessoas por aí que teriam feito isso antes para ajudar a responder a essa pergunta.