说我运行以下代码:
var mongoData = MongoSpark.load(sc, contextReadConfig)
val mongoDF = mongoData.toDF
//... do some selections, aggregations, etc that all get run on Mongo...
mongoData.createOrReplaceTempView("myNewView")
我在myNewView上做了很多处理,试图在一个循环中尝试不同的计算。当它启动时,我可以看到我的mongod进程在CPU利用率上猛增。我该如何做,以便在处理数据时不再将其一直追溯到Mongo?我需要对数据进行大量计算,并且不想锤击我的Mongo实例。
编辑:通过在数据帧上调用.cache()
,似乎可以解决此问题。是否可以保证与Mongo脱离联系?
答案 0 :(得分:2)
cache()
会将数据帧存储到内存中,如果创建了任何新数据帧,则有可能从内存中清除旧数据。
当您尝试使用第一个数据框时,它将再次在数据库上查询。
您可以使用cache()
而不是persist()
,并指定同时使用内存和光盘,这样,一旦内存溢出,数据就会写入光盘。
import org.apache.spark.storage.StorageLevel
mongoDF.persist(StorageLevel.MEMORY_AND_DISK)