scala – 在火花中有效地操纵RDD键的子集
我有一个RDD(键,值)对的形式
RDD[( scala.collection.immutable.Vector[(Byte,Byte)],scala.collection.immutable.Vector[Int] )] 其中key是Vector [(Byte,value是Vector [Int]. 例如,RDD的内容可以如下所示. (Vector((3,3),(5,5)),Vector(1,2)),(Vector((1,1),(2,2),(3,(4,4),3,4,3)),Vector(3, 我想对这个RDD进行操作,以便在最终的RDD中,对于每个(键值)对,满足以下条件. 当该RDD的密钥“k1”是该RDD的密钥“k2”的子集时,k1的值也应更新为包含k2的值,而k2的值将保持不变. 上面的例子RDD将成为, (Vector((3,2,4)),2)) (Vector((1,5)) 我已经提出了类似的问题here.提供的解决方案如下(稍作修改以适应我的问题).这对大型数据集非常有效. val resultPre = rddIn .flatMap { case (colMapkeys,rowIds) => colMapkeys.subsets.tail.map(_ -> rowIds) } .reduceByKey(_ ++ _) .join(rddIn map identity[(Seq[(Byte,Vector[Int])]) .map{ case (key,(v,_)) => (key,v) } implicit class SubSetsOps[T](val elems: Seq[T]) extends AnyVal { def subsets: Vector[Seq[T]] = elems match { case Seq() => Vector(elems) case elem +: rest => { val recur = rest.subsets recur ++ recur.map(elem +: _) } } } 生成所有的密钥子集,然后通过加入原始RDD密钥过滤它们似乎是无效的. 如何有效地处理这个问题? 解决方法
我觉得你的问题根本很难.你基本上有两种方法可以做到这一点:
>生成所有子集键,合并值列表,并收集任何给定子集的fina列表,然后加入现有子集. (这是你在做什么). 哪一个更有效率将取决于数据的性质(关键向量的大小,彼此的子集的次数等). 您可以尝试的其他优化是使数据更容易处理.例如,您可以将内部坐标映射到整数(它们只是Bytes).说(5,5)到5 * 1000 5 = 5005.由于整数比较比比较元组更容易和更快. 取决于您了解密钥领域的多少.如果这个空间足够小,可以尝试将密钥表示为位图或其他一些.这些更改将不会从根本上改变您拥有的密钥数量,但可能会使比较和其他操作更容易. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |