我正在寻找一种方法来智能地比较RDD的子集。比较RDD的子集
可以说我有一个类型为(Int-> T)的键/值对的RDD。我最终需要说“将键1的所有值与键2的所有值进行比较,并将键3的值与键5和键7的值进行比较”,我将如何有效地做到这一点?
目前我想这样做的方法是通过创建过滤RDDS的列表,然后使用RDD.cartesian()
def filterSubset[T] = (b:Int, r:RDD[(Int, T)]) => r.filter{case(name, _) => name == b}
Val keyPairs:(Int, Int) // all key pairs
Val rddPairs = keyPairs.map{
case (a, b) =>
filterSubset(a,r).cartesian(filterSubset(b,r))
}
rddPairs.map{whatever I want to compare…}
然后,我会遍历列表,并在每个执行地图对的RDD收集我需要的关系数据。
我不能告诉这个想法的是,设置数百个地图作业的可能性是否极其低效,然后遍历它们。在这种情况下,spark中的懒惰估值会优化所有映射之间的数据混洗吗?如果不是,有人可以推荐一种可能更有效的方法来解决这个问题吗?
谢谢您的帮助,您可以解决这个问题
你能更好地解释你的比较逻辑是什么?你想比较哪些键? –
当然,如果我有一个RDD [(Int,Vector)],那么一个很好的例子就是,我只想计算带有相关键的向量的余弦相似性(这些键基本上划分了不同的向量组)。 –
每个密钥有多少数据?它是一对一的映射还是您想与多个子集进行比较(如{1,{2,3,5,7})? – zero323