当前位置: 首页 > 知识库问答 >
问题:

编写超过5000万从Pyspark df到PostgresSQL,最有效的方法

施同
2023-03-14

从Spark数据框到Postgres表格插入数百万条记录的最有效方法是什么?我在过去通过使用批量复制和批量大小选项也成功地从火花到MSSQL做到了这一点。

有没有类似的东西可以在这里为博士后?

添加我尝试过的代码以及运行流程所需的时间:

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个并行连接,如NumPARtions中指定的,还尝试了200k的批量大小。

整个过程的总时间为0:14:05.760926(14分5秒)。

有没有其他有效的方法可以缩短时间?

我能使用的有效或最佳批量是多少?增加批量是否能更快地完成这项工作?或者打开多个连接,即

对于1000万条记录来说,平均14分钟是不错的,但是寻找那些以前会这样做的人来帮助回答这个问题。

共有1个答案

滑景胜
2023-03-14

我之前也做过类似的工作,但使用的是ApacheSqoop。

我想说,为了回答这个问题,我们必须尝试优化Spark和PostgresSQL之间的通信,特别是从Spark到PostgresSQL的数据流。

但要小心,不要忘记火花的一面。如果分区的数量与PostgreSQL支持的最大连接数量相比太高,那么执行mapPartitions是没有意义的。如果您有太多分区,并且要为每个分区打开一个连接,则可能会出现以下错误org。postgresql。util。PSQLException:致命:抱歉,已经有太多客户端

为了调整插入过程,我将按照以下步骤处理这个问题:

  • 记住分区的数量很重要。检查分区的数量,然后根据您想要的并行连接数量进行调整。您可能希望每个分区都有一个连接,因此我建议检查合并,如下所述

最后,做这项工作没有灵丹妙药。你可以使用我上面提到的所有技巧,但这实际上取决于你的数据和用例。

 类似资料:
  • 问题内容: 将File写入javax.servlet.ServletOutputStream的最有效方法是什么? 编辑: 如果使用NIO会更有效吗? 问题答案: 哪里是的FileInputStream和是。 IOUtils是Apache Commons中 Commons IO 模块的实用程序。

  • 问题内容: 使小写的第一个字符最有效的方法是什么? 我可以想到许多方法来做到这一点: 使用与 或使用数组 我相信还有许多其他好的方法可以实现这一目标。您有什么推荐的吗? 问题答案: 我使用JMH测试了有前途的方法。完整的基准代码。 测试期间的假设(以避免每次都检查极端情况):输入的String长度始终大于1。 结果 分数是每秒的操作数,越高越好。 测验 首先是Andy和Hllink的方法: 是第二

  • 本文向大家介绍Android:如何编写“万能”的Activity,包括了Android:如何编写“万能”的Activity的使用技巧和注意事项,需要的朋友参考一下 前言 自己android开发也有些年头了,每每回想起作为初学者的时候自己写的代码,自己会有种喷自己的冲动,代码写的太渣了。因此想着自己要总结下以前代码中的不合理的地方,希望能给初学者一些帮助。我希望这是一个系列的文章。 本节内容 一个“

  • 问题内容: 我有一个很大的数据集,我必须将其转换为.csv格式,我有29列和超过一百万行。我正在使用python和pandas数据框来处理此工作。我认为,随着数据框变大,将任何行追加到它会越来越耗时。我想知道是否有更快的方法,可以共享代码中的相关代码段。 任何建议,但欢迎。 问题答案: 正如Mohit Motwani建议的最快方法是将数据收集到字典中,然后将所有内容加载到数据帧中。下面是一些速度测

  • 我说的问题是这个 问题陈述: 返回给定字符串的一个版本,其中对于字符串中的每个星号(),其左右两侧的星号和字符都将消失。所以“abcd”产生“ad”,而“ab**cd”也产生“ad”。 StarOut("ab*cd")→"ad" StarOut("ab**cd")→"ad" starOut(“sm*eilly”)→ “傻” 我得到的解决方案有点混乱,我使用了大约6个if语句和一个特定案例的处理,寻

  • 我有两个Arraylist,A和B。 ArrayList B由不同的类组成,这些类包含不同的数据集,包括。对此列表中的每个项都是唯一的。示例:。 这两个列表都按进行排序,希望这样做更容易。 我要做的是创建一个新的列表C,它由listB中至少与Lista有一个交集的项组成。因此列表C应该包含上述给定输入的项。