Spark:在大型组的情况下,Cogroup RDD会失败



下午好!我有一个问题:

val rdd1: RDD[(key, value)] = ...
val rdd2: RDD[(key, othervalue)] = ...

我想过滤rdd1并扔掉所有不在rdd2中的元素.我知道两种方法可以做到这一点。

第一:

val keySet = rdd2.map(_.key).distinct().collect().toSet
rdd1.filter(x => keySet.contains(x))

它不起作用,因为keySet很大并且不适合内存。

另一个:

rdd1.cogroup(rdd2)
  .filter(x => x._2._2.nonEmpty)
  .flatMap(x => x._2._1)

这里发生了一些事情,我得到两种错误(在不同的代码位置):java.lang.IllegalArgumentException: Size exceeds Integer.MAX_VALUEjava.lang.ArrayIndexOutOfBoundException

我认为这是因为我的团队太大了。

那么我该如何解决呢?有没有解决此类问题的常用方法?

您是否考虑过使用 subtractByKey

类似的东西

rdd1.map(x => (x, x))
    .subtractByKey(rdd2)
    .map((k,v) => k)

考虑 rdd1.subtractByKey( rdd1.subtractByKey(rdd2) )。rdd1.subByKey(rdd2) 将获得那些键在 rdd1 中但不在 rdd2 中的元素。 这恰恰相反。 减去那些将得到你想要的。

相关内容

  • 没有找到相关文章

最新更新