将数百万条记录从 Spark 数据帧插入到 Postgres 表的最有效方法是 5000 万条记录。
我已经做到了从 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 万条记录和 做了上述方法。有 5 个并行连接,如
numPartitions
中所述并且还尝试了 200k 的批量大小 .该过程花费的总时间为 0:14:05.760926 (十四分五秒)。
有没有其他有效的方法可以减少时间?
我可以使用的有效或最佳批量大小是多少?增加我的批量大小会更快地完成工作吗?或者打开多个连接,即 > 5 帮助我加快进程?
在 1000 万条记录平均 14 分钟还不错 ,但正在寻找那些以前会这样做的人来帮助回答这个问题。
最佳答案
实际上,我不久前做了一些相同的工作,但使用的是 Apache Sqoop。
我想说,为了回答这个问题,我们必须尝试优化 Spark 和 PostgresSQL 之间的通信,特别是从 Spark 到 PostgreSql 的数据流。
但要小心,不要忘记 Spark 的一面。执行 没有意义 map 分区如果分区数与最大连接数相比过高
PostgreSQL 支持,如果你有太多的分区并且你每个都打开一个连接,你可能会出现以下错误 org.postgresql.util.PSQLException: FATAL: sorry, too many clients already
.
为了调整插入过程,我将按照以下步骤解决问题:
coalesce
,正如前面提到的 here . 最后,没有什么 Elixir 可以完成这项工作。您可以使用我上面提到的所有技巧,但这实际上取决于您的数据和用例。
关于postgresql - 将超过 5000 万从 Pyspark df 写入 PostgresQL,最有效的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59269813/