Sto lavorando a questi due concetti proprio ora e vorrei una certa chiarezza. Dal lavoro attraverso la riga di comando, ho cercato di identificare le differenze e quando uno sviluppatore avrebbe usato la ripartizione vs partitionBy.Pyspark: ripartizione vs partizioneBy
Ecco alcuni esempi di codice:
rdd = sc.parallelize([('a', 1), ('a', 2), ('b', 1), ('b', 3), ('c',1), ('ef',5)])
rdd1 = rdd.repartition(4)
rdd2 = rdd.partitionBy(4)
rdd1.glom().collect()
[[('b', 1), ('ef', 5)], [], [], [('a', 1), ('a', 2), ('b', 3), ('c', 1)]]
rdd2.glom().collect()
[[('a', 1), ('a', 2)], [], [('c', 1)], [('b', 1), ('b', 3), ('ef', 5)]]
ho preso uno sguardo alla realizzazione di entrambi, e l'unica differenza che ho notato per la maggior parte è che partitionBy può assumere una funzione di partizionamento, o utilizzando il portable_hash per impostazione predefinita. Quindi in partitionBy, tutte le stesse chiavi dovrebbero essere nella stessa partizione. Nella ripartizione, mi aspetto che i valori siano distribuiti in modo più uniforme sulle partizioni, ma questo non è il caso.
Dato questo, perché qualcuno dovrebbe mai utilizzare la ripartizione? Suppongo che l'unica volta in cui potrei vederlo essere usato è se non sto lavorando con PairRDD, o ho una grande inclinazione dei dati?
C'è qualcosa che mi manca, o qualcuno potrebbe far luce da un angolo diverso per me?
Qual è la ragione per cui ripartizione non distribuisce gli elementi in modo uniforme ish attraverso le partizioni? Potrebbe essere un caso in cui non ho abbastanza dati e stiamo riscontrando un piccolo problema di dimensioni del campione? –
Buona domanda, sto vedendo una distribuzione uniforme durante il tentativo (in Scala). –
@JoeWiden Nient'altro che una semplice probabilità. 'ripartizione' sta in realtà utilizzando la coppia RDD internamente aggiungendo la chiave casuale ai valori esistenti in modo da non fornire forti garanzie sulla distribuzione dei dati di output. BTW Probabilmente dovresti accettare la risposta. – zero323