¿Cuál sería la forma más eficiente de insertar millones de registros? Por ejemplo, 50 millones de un marco de datos de Spark a tablas de Postgres. He hecho esto desde la chispa a MSSQL en el pasado haciendo uso de la opción de copia masiva y tamaño de lote que también fue exitosa.
¿Hay algo similar que pueda estar aquí para Postgres?
Agregué el código que probé y el tiempo que tomó ejecutar el proceso:
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()
Así que hice el enfoque anterior para 10 millones de registros y tuve 5 conexiones paralelas como se especifica en numPartitions
y también probé un tamaño de lote de 200k .
El tiempo total que llevó el proceso fue 0: 14: 05.760926 (catorce minutos y cinco segundos).
¿Existe algún otro enfoque eficiente que reduzca el tiempo?
¿Cuál sería el tamaño de lote eficiente u óptimo que puedo usar? ¿Aumentar el tamaño de mi lote hará el trabajo más rápido? ¿O abrir varias conexiones, es decir,> 5 me ayuda a acelerar el proceso?
En promedio, 14 minutos para 10 millones de registros no está mal , pero buscar personas que hubieran hecho esto antes para ayudar a responder esta pregunta.