Nella documentazione di Spark, si afferma che il metodo RDDs reduce
richiede una funzione binaria associativa AND commutativa.Spark: differenza di semantica tra riduzione e riduzione. KEY
Tuttavia, il metodo reduceByKey
richiede SOLO una funzione binaria associativa.
sc.textFile("file4kB", 4)
Ho fatto alcuni test e apparentemente è il comportamento che ottengo. Perché questa differenza? Perché reduceByKey
assicura che la funzione binaria sia sempre applicata in un determinato ordine (per ovviare alla mancanza di commutatività) quando lo reduce
non lo fa?
esempio, se un carico qualche (piccolo) testo con 4 partizioni (minimo):
val r = sc.textFile("file4k", 4)
quindi:
r.reduce(_ + _)
restituisce una stringa in cui parti non sono sempre nello stesso ordine, mentre:
r.map(x => (1,x)).reduceByKey(_ + _).first
restituisce sempre la stessa stringa (dove tutto è nello stesso ordine rispetto all'originale) l file).
(Ho controllato con r.glom
e il contenuto del file è effettivamente distribuito su 4 partizioni, non c'è nessuna partizione vuota).
Credo che l'idea con 'reduceByKey' è che probabilmente avete un sacco di chiavi diverse, quindi va bene ridurre tutto per un singolo tasto su un singolo thread, il che significa che puoi sempre eseguire il calcolo da sinistra a destra. Al contrario, 'reduce' viene spesso utilizzato su un grande set di dati, quindi non deve preoccuparsi dell'ordine delle operazioni. –
Quanti esecutori stai usando nei tuoi esperimenti? – gprivitera