spark - 在地图内过滤

nir*_*nir 11 java apache-spark

我正在尝试过滤内部地图功能.基本上我在经典map-reduce中这样做的方式是mapper在过滤条件满足时不会向上下文写任何东西.我怎样才能与火花相似?我似乎无法从map函数返回null,因为它在shuffle步骤中失败.我可以使用过滤器功能,但是在我可以在地图期间执行相同的任务时,它似乎是不必要的数据集迭代.我也可以尝试使用虚拟键输出null,但这是一个糟糕的解决方法.

maa*_*asg 14

选项很少:

rdd.flatMap:rdd.flatMap将一个Traversable集合压缩到RDD中.要选择元素,通常会返回Option转换结果.

rdd.flatMap(elem => if (filter(elem)) Some(f(elem)) else None)
Run Code Online (Sandbox Code Playgroud)

rdd.collect(pf: PartialFunction)允许您提供可以过滤和转换原始RDD中的元素的部分函数.您可以使用此方法的所有模式匹配功能.

rdd.collect{case t if (cond(t)) => f(t)}
rdd.collect{case t:GivenType => f(t)}
Run Code Online (Sandbox Code Playgroud)

正如Dean Wampler在评论中提到的那样,rdd.map(f(_)).filter(cond(_))可能与上面提到的其他更"简洁"的选项一样好,甚至更快.

f转换(或映射)函数在哪里.

  • 如果使用`... filter().map()`,它们将在每个分区的相同任务中执行,类似于在MapReduce中链接"映射器".这甚至可能比单个"flatMap"或"collect"更快,具体取决于分配了多少临时对象,然后快速收集垃圾. (3认同)