加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 在火花中有效地操纵RDD键的子集

发布时间:2020-12-16 19:08:25 所属栏目:安全 来源:网络整理
导读:我有一个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
我有一个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.由于整数比较比比较元组更容易和更快.

取决于您了解密钥领域的多少.如果这个空间足够小,可以尝试将密钥表示为位图或其他一些.这些更改将不会从根本上改变您拥有的密钥数量,但可能会使比较和其他操作更容易.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读