Spark: les RDD du Cogroup échouent en cas de groupe énorme

Bonne après-midi! J'ai un problème:

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

Je veux filtrer rdd1 et rejeter tous les éléments qui ne sont pas dans rdd2 . Je connais deux façons de le faire.

Premier:

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

Ça ne marche pas parce que keySet est grand et ne rentre pas dans la mémoire.

Un autre:

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

here something happens and I get two kinds of errors (in different places of code): java.lang.IllegalArgumentException: Size exceeds Integer.MAX_VALUE and java.lang.ArrayIndexOutOfBoundException

Je pense que c'est parce que mes groupes sont trop grands.

Alors, comment puis-je le réparer? Existe-t-il une méthode commune pour résoudre ce problème?

0

2 Réponses

Avez-vous envisagé d'utiliser soustractionByKey ?

quelque chose dans le sens de

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

Considérons rdd1.subtractByKey (rdd1.subtractByKey (rdd2)). rdd1.subtractByKey (rdd2) obtiendra ces éléments avec des clés qui sont dans rdd1 mais pas dans rdd2. C'est le contraire de ce que vous voulez. SubtractByKey-ing ceux-ci obtiendront exactement ce que vous voulez.

0
ajouté