从Spark数据帧向Postgres Tables插入数百万条记录(例如5000万条)的最有效方法是。过去,我通过使用批量复制和批处理大小选项(从成功的火花到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可以帮助我更快地完成此过程?
在一个平均14分钟10万条记录是不坏,但找的人在那里谁也以前做过这有助于回答这个问题。
1
您可以先将数据转储到本地CSV文件中,然后使用PostgreSQL自己的导入工具将其导入-这取决于瓶颈所在:从Pyspark导出的速度慢还是从Postgres导入的速度慢?(也就是说,对于5000万行来说14分钟对于我来说似乎并不糟糕-表上定义了哪些索引?)。
—
戴
戴,我有一个5200万的df,现在我将其写入Postgres,这是我通过上述代码创建的新表。我尚未在Postgres中创建表格,然后在此处编写。如果我可以先创建一个表并在Postgres中对其建立索引,然后再从spark df发送数据,是否存在更好的可能性?
—
Chetan_Vasudevan '19
(这是另一种方式-索引减慢了对表的插入操作,但加快了选择查询的速度)
—
戴
戴,所以我只是在Postgres中创建没有索引的表,然后尝试插入并评估我的性能?
—
Chetan_Vasudevan