在mapPartitions(Spark)中简化结果

时间:2017-01-17 11:00:45

标签: scala apache-spark rdd

有没有办法在mapPartitions()

中返回部分结果

目前我这样使用它:

myRDD.mapPartitions{
  iter: iterator[InputType] => {
    val additionalData = <some costly init operation>
    val results = ArrayBuffer[OutputType]()
    for(input: InputType <- iter) results += (transform(input, additionalData))
    results.iterator
  }
}

但是当然如果分区太大,results数组将抛出OOM异常。

所以我的问题是:有没有办法每隔一段时间发送一次部分结果,以避免任何OOM?

我想坚持mapPartitions,因为我在处理输入之前初始化一个代价高昂的对象(例如获取一个大的广播变量的值),而我不希望在每个记录中都这样做map 1}}

1 个答案:

答案 0 :(得分:1)

如果additionalData无法访问迭代器,您只能map

myRDD.mapPartitions{
  iter: iterator[InputType] => {
    val additionalData = ???
    iter.map(input => transform(input, additionalData))
}}