spark - 地图内的过滤器

spark - filter within map

我正在尝试在地图函数内部进行过滤。基本上,我在经典 map-reduce 中的做法是,当过滤条件满足时,mapper 不会向上下文写入任何内容。我怎样才能用火花实现类似的目标?我似乎无法从 map 函数中 return null ,因为它在随机播放步骤中失败了。我可以使用过滤器功能,但似乎不必要的数据集迭代,而我可以在地图期间执行相同的任务。我也可以尝试使用虚拟键输出 null,但这是一个糟糕的解决方法。

选项很少:

rdd.flatMaprdd.flatMap 会将 Traversable 集合展平到 RDD 中。要选择元素,您通常会 return 一个 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(_)) 可能与上面提到的其他 'terse' 个选项一样好,甚至更快。

其中 f 是转换(或映射)函数。

也许试试map_filter(col, lambda-function) 以下是文档:https://spark.apache.org/docs/latest/api/python/reference/api/pyspark.sql.functions.map_filter.html#pyspark.sql.functions.map_filter