Spark,从每个分区获取单个值的有效方法吗?累加器?

时间:2019-11-15 08:17:15

标签: apache-spark rdd lazy-evaluation partition accumulator

在我的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的求值(一个在代码中,另一个在以后),这很重。而且,cachepersist会有所帮助,但我无法在我的应用中使用。

是否有什么好方法可以从每个分区中收集对象? 蓄能器怎么样?

2 个答案:

答案 0 :(得分:1)

使传递给mapPartitions的函数返回仅包含摘要对象的迭代器。然后,您可以直接进行收集,而无需进行任何其他过滤。

答案 1 :(得分:1)

  

您为什么不能使用缓存或持久化? – Dennis Jaheruddin

     

@DennisJaheruddin,因为df可能很大,比我的记忆大一百倍。 – user2037661

如果要缓存内存中不适合的数据帧,则可以使用存储级别MEMORY_AND_DISK。当前,此存储级别是调用cachepersist时的默认存储级别。