【发布时间】:2020-04-03 19:00:54
【问题描述】:
将数百万条记录插入到 Postgres 表中的最有效方法是什么,例如从 Spark 数据帧中插入 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 帮助我加快处理速度?
对于 1000 万条记录,平均 14 分钟还不错,但要寻找以前会这样做的人来帮助回答这个问题。
【问题讨论】:
-
您可以先将数据转储到本地 CSV 文件,然后使用 PostgreSQL 自己的导入工具进行导入 - 这取决于瓶颈在哪里:是从 Pyspark 导出慢还是导入慢到 Postgres,还是别的什么? (也就是说,5000 万行的 14 分钟对我来说似乎并没有那么糟糕 - 表上定义了哪些索引?)。
-
Dai,我有一个 52mil 的 df,现在我正在将其写入 Postgres,这是我通过上述代码创建的一个新表。我还没有在 Postgres 中创建表然后在那里写。如果我可以先创建一个表并在 Postgres 中对其进行索引,然后从 spark df 发送数据,是否有更好的可能性?
-
(反之亦然 - 索引会减慢表上的插入操作,但会加快选择查询)
-
Dai,所以我只是在没有索引的 Postgres 中创建表,然后尝试插入并测量我的性能?
-
stackoverflow.com/questions/758945/… 可能会有所帮助。
标签: postgresql apache-spark pyspark apache-spark-sql bigdata