2015-02-24 16 views
8

Relativi a Spark - Joining 2 PairRDD elementsIn spark join, l'ordine del tavolo è come nel maiale?

Quando si effettua un regolare join nel maiale, l'ultima tabella nel join non viene portato in memoria, ma in streaming attraverso, invece, quindi se A ha piccola cardinalità per tasto e B grande cardinalità, è significativamente migliore per fare join A, B di join A by B, dal punto di vista delle prestazioni (evitando fuoriuscita e OOM)

Esiste un concetto simile nella scintilla? Non ho visto nessuna raccomandazione del genere e mi chiedo come sia possibile? L'implementazione mi sembra più o meno la stessa del maiale: https://github.com/apache/spark/blob/master/core/src/main/scala/org/apache/spark/rdd/CoGroupedRDD.scala

O mi manca qualcosa?

risposta

3

Non fa differenza, in scintilla l'RDD verrà messo in memoria solo se è memorizzato nella cache. Quindi, nella scintilla per ottenere lo stesso effetto, è possibile memorizzare nella cache il RDD più piccolo. Un'altra cosa che puoi fare nella scintilla, che non sono sicuro che faccia il maiale, è che se tutti gli RDD sono uniti hanno lo stesso partizionatore che non deve essere fatto shuffle.

+0

ok, ma supponiamo di non memorizzare nella cache alcun RDD. Presumo che questa scintilla faccia una sorta di loop nidificati tra i 2 RDD. Se A ha record 1M per chiave join, e B ha solo 3 record per chiave join, ma entrambi sono enormi. Se la tabella esterna (a sinistra) è A, ogni tasto di join causerà la fuoriuscita del disco ... giusto? – ihadanny

+0

@ihadanny se si guarda la [fonte] (https://github.com/apache/spark/blob/master/core/src/main/scala/org/apache/spark/rdd/PairRDDFunctions.scala#L503) tutto è un iteratore, quindi nulla è necessariamente caricato in memoria, quando un iteratore è esaurito, sarebbe solo dall'inizio, che detto così sembra che il ciclo for lascerebbe l'output in memoria – aaronman