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

Apache spark 如何使用foreachPartition(pySpark)将分区写入Postgres,apache-spark,pyspark,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 o

我对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 
但在使用以下代码写入DB时:

iterator.write.option("numPartitions", count).option("batchsize", 
 1000000).jdbc(url=url, table="table_name", mode=mode, 
  properties=properties) 
给出一个错误:

*AttributeError:'itertools.chain'对象没有属性'write'模式为append且已设置属性


关于如何将df分区写入DB的任何线索,您都不需要这样做

文件中沿着这些线说明了这一点,并同时出现:

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

有一些性能方面需要考虑,但是可以被Google。

感谢@ BeLePHANTROM,只是稍微加上一点,如果表已经存在,保存模式也需要定义。 以下是我成功的实施方案:-

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)

可能是我错了,但是DF.write是否还没有并行执行?UI已经尝试过这样做,但在我的情况下失败了,内存错误。我已经增加了GC和堆内存,但这并没有帮助,但这就是实现的方法。那是你当时问的另一个问题。请参阅@user10121535如果您的代码因GC错误而失败,您可以非常肯定问题不在这里。@BluePhantom,您认为这对数百万(50)条记录有效吗?5000万条对于大数据来说算不上什么,除非您预计在1秒之内。但这是一个RDBMS,所以您可以增加上面所示的并行性,我认为postgres中可能也存在非日志模式。例如。