我有一个RDD [(Int,List [Int])],它在每个分区中都有一个唯一的整数键。假设数据被分区为
分区1 - > (1,List1),(2,List2)
分区2 - > (1,List3),(2,List4)
所以,当我想查找索引1的值时,我希望有
分区1 - > (列表1)
分区2 - > (项目list3)
但是返回类型应该是RDD [List(Int)]而不是Array [List(Int)],这意味着我仍然希望集群上的分布式集合没有收集到驱动程序。
目前我正在使用过滤器(案例{(k,v)=> k == key})。map(_._ 2)但我知道这不会进行查找而是按顺序搜索。
我知道有查找方法,但它返回而数组不是RDD。 IndexedRDD也是如此。
那么有没有办法在Spark中做到这一点?
答案 0 :(得分:0)
我认为你可以使用mapPartitionsWithIndex
。您可以从rdd的分区程序中获取感兴趣的分区,并且在(Int,Iterator)=>Iterator
函数中,如果它不是感兴趣的分区,您将返回一个空的迭代器。为简单起见,我可能会在正确的分区中返回传入的迭代器,然后再使用RDD.filter来简化代码。
在这里操作的迭代器大概是懒惰的,所以你的函数实际上只应用于分区号,而不是从迭代器中获取结果。