如何使用foreachPartition(pySpark)将分区写入Postgres

时间:2018-07-25 09:15:25

标签: apache-spark pyspark

我是Spark的新手,正在尝试将df分区添加到Postgres 这是我的代码:

//csv_new is a DF with nearly 40 million rows and 6 columns

csv_new.foreachPartition(callback) // there are 19204 partitions
def callback(iterator):
   print(iterator)

// the print gives me itertools.chain object 

但是在使用以下代码写入数据库时​​:

iterator.write.option("numPartitions", count).option("batchsize", 
 1000000).jdbc(url=url, table="table_name", mode=mode, 
  properties=properties) 

出现错误:

  

* AttributeError:'itertools.chain'对象没有属性,'写'模式已附加并设置了属性

任何人都将介绍如何将df分区写入数据库

2 个答案:

答案 0 :(得分:0)

您不需要这样做。

文档按照以下说明进行声明,并且并行发生:

df.write.format("jdbc")
  .option("dbtable", "T1")
  .option("url", url1)
  .option("user", "User")
  .option("password", "Passwd")
  .option("numPartitions", "5") // to define parallelism
  .save()

有一些表演方面需要考虑,但是可以谷歌搜索。

答案 1 :(得分:0)

非常感谢@thebluephantom,如果表已经存在,还需要定义一些附加功能。 以下是我的有效的实现:-

mode = "Append"
url = "jdbc:postgresql://DatabaseIp:port/DB Name"
properties = {"user": "username", "password": "password"}

df.write
  .option("numPartitions",partitions here)
  .option("batchsize",your batch size default is 1000)
  .jdbc(url=url, table="tablename", mode=mode, properties=properties)