从pyspark DF创建字典的最快方法

时间:2017-12-07 10:47:41

标签: pyspark spark-dataframe pyspark-sql snappydata

我正在使用带有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)

有没有更快的方法?

2 个答案:

答案 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))