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

Cor*_* Wu 6 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"))
Run Code Online (Sandbox Code Playgroud)

还有这个:

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)
Run Code Online (Sandbox Code Playgroud)

在哪mapRDD一个类型RDD[Map[String, String]],在一个通行证.

dpe*_*ock 6

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

通常,使用Pair RDD可以实现您想要实现的目标

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

val keyByState = mapRDD.keyBy(_("state"))
Run Code Online (Sandbox Code Playgroud)

然后执行groupByKey,reduceByKey等操作.

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