我正在使用带有pyspark的Snappydata来运行我的sql查询并将输出DF转换为字典以将其批量插入到mongo中。 我经历了许多类似的测试,以测试火花DF转换为字典。
目前,我正在使用map(lambda row: row.asDict(), x.collect())
此方法将批量 DF转换为字典。 10K记录需要2-3秒。
我在下面说明了我如何表达我的想法:
x = snappySession.sql("select * from test")
df = map(lambda row: row.asDict(), x.collect())
db.collection.insert_many(df)
有没有更快的方法?
答案 0 :(得分:0)
我会研究一下你是否可以直接从Spark写入Mongo,因为这将是最好的方法。
如果失败,您可以使用此方法:
x = snappySession.sql("select * from test")
dictionary_rdd = x.rdd.map(lambda row: row.asDict())
for d in dictionary_rdd.toLocalIterator():
db.collection.insert_many(d)
这将以分布式方式在Spark中创建所有词典。行将返回到驱动程序并一次插入Mongo一行,这样就不会耗尽内存。
答案 1 :(得分:0)
我建议使用foreachPartition
:
(snappySession
.sql("select * from test")
.foreachPartition(insert_to_mongo))
其中insert_to_mongo
:
def insert_to_mongo(rows):
client = ...
db = ...
db.collection.insert_many((row.asDict() for row in rows))