Apache spark Spark,从每个分区获得单个值的有效方法?蓄电池?

Apache spark Spark,从每个分区获得单个值的有效方法?蓄电池?,apache-spark,rdd,lazy-evaluation,partition,accumulator,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(_.

在我的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对象,
数据
将用于RDD处理。 问题是,在我的应用程序中,代码会产生两次
df
的求值(一次在代码中,另一次在后面),这很重。而且,
cache
persist
将有所帮助,但我无法在我的应用程序中使用

有什么好方法可以从每个分区收集对象吗?
累加器怎么样?

使传递给
mapPartitions
的函数返回一个仅包含summary对象的迭代器。然后你可以直接收集,不需要任何额外的过滤


为什么不能使用缓存或持久化丹尼斯·杰鲁丁

@DennisJaheruddin因为df是巨大的,比我的记忆大上百倍用户2037661


如果要缓存内存中不适合的数据帧,可以使用存储级别
内存和磁盘。调用
cache
persist

累加器时,此存储级别当前是默认的,因为您无法在转换或操作中真正使用累积值。您是否尝试过
select
为什么不能使用cache或persist?@DennisJaheruddin,因为
df
可能非常大,你的意思是``val summaries=df.mapPartitions(=>/*add Summary Object*/)。collect()val data=df.mapPartitions(=>/*data process*/)``我认为它不能解决问题,因为它还需要两次求值。