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