我正在尝试过滤内部地图功能。基本上我在经典map-reduce中执行此操作的方式是mapper在过滤条件满足时不会向上下文写入任何内容。我怎样才能与火花相似?我似乎无法从map函数返回null,因为它在shuffle步骤中失败。我可以使用过滤器功能,但是在我可以在地图期间执行相同的任务时,它似乎是不必要的数据集迭代。我也可以尝试使用虚拟键输出null,但这是一个糟糕的解决方法。
答案 0 :(得分:14)
选项很少:
rdd.flatMap
:rdd.flatMap
会将Traversable
集合压缩到RDD中。要选择元素,您通常会返回Option
作为转换的结果。
rdd.flatMap(elem => if (filter(elem)) Some(f(elem)) else None)
rdd.collect(pf: PartialFunction)
允许您提供可以过滤和转换原始RDD中元素的部分函数。您可以使用此方法的所有模式匹配功能。
rdd.collect{case t if (cond(t)) => f(t)}
rdd.collect{case t:GivenType => f(t)}
正如Dean Wampler在评论中提到的,rdd.map(f(_)).filter(cond(_))
可能与上面提到的其他更“简洁”的选项一样好,甚至更快。
其中f
是转换(或映射)函数。