在我的spark应用程序中,每个分区都生成一个对象,该对象很小,并且包含该分区中数据的摘要。现在,我将它们放入也包含主要数据的Datafram中进行收集。
val df: DataFrame[(String, Any)] = df.mapPartitions(_ => /*add Summary Object*/ )
val summaries = df.filter(_._1 == "summary").map(_._2).collect()
val data = df.filter(_._1 == "data").map(_._2) // used to further RDD processing
将立即使用Summary对象,而data
将用于RDD处理。
问题在于,代码在我的应用程序中两次生成df
的求值(一个在代码中,另一个在以后),这很重。而且,cache
或persist
会有所帮助,但我无法在我的应用中使用。
是否有什么好方法可以从每个分区中收集对象? 蓄能器怎么样?
答案 0 :(得分:1)
使传递给mapPartitions
的函数返回仅包含摘要对象的迭代器。然后,您可以直接进行收集,而无需进行任何其他过滤。
答案 1 :(得分:1)
您为什么不能使用缓存或持久化? – Dennis Jaheruddin
@DennisJaheruddin,因为df可能很大,比我的记忆大一百倍。 – user2037661
如果要缓存内存中不适合的数据帧,则可以使用存储级别MEMORY_AND_DISK
。当前,此存储级别是调用cache
或persist
时的默认存储级别。