从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