Apache spark 如何使用foreachPartition(pySpark)将分区写入Postgres
我对Spark是个新手,我尝试着将df分区分配给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
//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中可能也存在非日志模式。例如。