Scala Spark-RDD上的多个过滤器一次完成
我的RDD是Scala Spark-RDD上的多个过滤器一次完成,scala,apache-spark,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 =&g
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)
val wage10to20=mapRDD.filter(person=>person(“wage”).toDouble>10&&person(“wage”).toDouble>20&&person(“wage”).toDouble>30&&person(“wage”).toDouble>40&&person(“wage”).toDouble我想你的意思是想为每个值返回单独的RDD(即,不只是做person=>Set(“NY”、“或”、“MA”、“WA”)。包含(person(“state”))
)
通常,您试图实现的目标可以使用
在第一个示例中,您可以使用:
val keyByState = mapRDD.keyBy(_("state"))
然后执行groupByKey、reduceByKey等操作
或者在第二个示例中,按工资四舍五入到最接近的10进行输入。如果最终需要在单独的RDD中使用它们,则在某个时候需要单独的过滤器和多次扫描。您应该缓存正在遍历的RDD(在第一个示例中为mapRDD),以防止它被多次读取
编写过滤器时进行过滤比按照另一个答案中的建议进行分组有一个优势,因为过滤器可以在地图端进行,而分组后进行过滤将需要对周围的所有数据进行洗牌(包括与不需要的状态相关的数据…)使用分布式集合需要更改心智模型。可能您不需要进行此类筛选选择。考虑替代方案,对事物进行分组。谢谢!一个问题:当我执行keyBy
后接groupByKey
时,我会得到String
和CompactBuffer的pairdd
。然后如何将其转换为映射[字符串,字符串]
的多个RDD?