Jaki byłby najbardziej efektywny sposób wstawiania milionów rekordów, mówi 50 milionów z ramki danych Spark do tabel Postgres. Robiłem to od Spark do MSSQL w przeszłości, korzystając z opcji kopiowania zbiorczego i opcji wielkości partii , która również się powiodła.
Czy istnieje coś podobnego dla Postgres?
Dodanie kodu, który próbowałem i czasu potrzebnego do uruchomienia procesu:
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()
Więc zastosowałem powyższe podejście dla 10 milionów rekordów i miałem 5 równoległych połączeń, jak określono w, numPartitions
a także próbowałem wielkości partii 200k .
Całkowity czas potrzebny na proces wyniósł 0: 14: 05.760926 (czternaście minut i pięć sekund).
Czy istnieje inne skuteczne podejście, które skróciłoby czas?
Jakiego efektywnego lub optymalnego rozmiaru partii mogę użyć? Czy zwiększenie wielkości mojej partii przyspieszy pracę? Czy otwieranie wielu połączeń, tj.> 5, pomaga mi przyspieszyć proces?
Na zasadzie średnio 14 minut na 10 milionów płyt nie jest złe , ale patrząc na ludzi, którzy tam zrobiłby to wcześniej, aby pomóc odpowiedzieć na to pytanie.