Spark - 一次通过RDD上的多个过滤器

时间:2015-07-06 21:06:28

标签: scala apache-spark

我的RDD为Map[String, String];有没有办法多次调用filter而不经过RDD多次?

例如,我想做这样的事情:

val stateNY = mapRDD.filter(person => person("state").equals("NY"))
val stateOR = mapRDD.filter(person => person("state").equals("OR"))
val stateMA = mapRDD.filter(person => person("state").equals("MA"))
val stateWA = mapRDD.filter(person => person("state").equals("WA"))

和此:

val wage10to20 = mapRDD.filter(person => person("wage").toDouble > 10 && person("wage").toDouble <= 20)
val wage20to30 = mapRDD.filter(person => person("wage").toDouble > 20 && person("wage").toDouble <= 30)
val wage30to40 = mapRDD.filter(person => person("wage").toDouble > 30 && person("wage").toDouble <= 40)
val wage40to50 = mapRDD.filter(person => person("wage").toDouble > 40 && person("wage").toDouble <= 50)

其中mapRDD的类型为RDD[Map[String, String]],一次通过。

2 个答案:

答案 0 :(得分:6)

我认为你的意思是你想为每个值返回单独的RDD(即不是简单地做person => Set("NY", "OR", "MA", "WA").contains(person("state"))

通常使用Pair RDDs

可以实现您想要实现的目标

在您的第一个示例中,您可以使用:

val keyByState = mapRDD.keyBy(_("state"))

然后执行诸如groupByKey,reduceByKey等操作

或者在你的第二个例子中,按工资向下舍入到最接近的10。

答案 1 :(得分:1)

如果您最终在单独的RDD中需要它们,则需要在某些时候使用单独的过滤器和多次扫描。您应该缓存您正在遍历的RDD(第一个示例中的mapRDD),以防止多次读取它。

在编写过滤器时执行过滤器与在另一个答案中建议的分组相比具有优势,因为过滤器可以在地图侧进行,而分组后过滤则需要对所有数据进行混洗(包括相关数据)陈述你不需要...)