2015-09-21 4 views
6

Sto usando Spark 1.3.1 e sono curioso del perché Spark non permetta l'utilizzo di chiavi di array sulla combinazione lato mappa. Pezzo di combineByKey function:Perché Spark non consente la combinazione del lato mappa con i tasti dell'array?

if (keyClass.isArray) { 
    if (mapSideCombine) { 
    throw new SparkException("Cannot use map-side combining with array keys.") 
    } 
} 
+0

Potete per favore elaborare? Cosa vuoi fare con le chiavi? o cosa vuoi chiave che non puoi? – TravisJ

risposta

7

In sostanza per lo stesso motivo per cui default partitioner cannot partition array keys.

Scala Array è solo un involucro intorno matrice Java e la sua hashCode non dipende tenore:

scala> val x = Array(1, 2, 3) 
x: Array[Int] = Array(1, 2, 3) 

scala> val h = x.hashCode 
h: Int = 630226932 

scala> x(0) = -1 

scala> x.hashCode() == h1 
res3: Boolean = true 

Ciò significa che due array con esattamente lo stesso contenuto non sono uguali

scala> x 
res4: Array[Int] = Array(-1, 2, 3) 

scala> val y = Array(-1, 2, 3) 
y: Array[Int] = Array(-1, 2, 3) 

scala> y == x 
res5: Boolean = false 

Come risultato Arrays non può essere utilizzato come chiave significativa. Se non siete convinti basta controllare che cosa succede quando si utilizza Array come chiave per la Scala Map:

scala> Map(Array(1) -> 1, Array(1) -> 2) 
res7: scala.collection.immutable.Map[Array[Int],Int] = Map(Array(1) -> 1, Array(1) -> 2) 

Se si desidera utilizzare una raccolta come chiave si dovrebbe utilizzare una struttura dati immutabili come un Vector o un List.

scala> Map(Array(1).toVector -> 1, Array(1).toVector -> 2) 
res15: scala.collection.immutable.Map[Vector[Int],Int] = Map(Vector(1) -> 2) 

Consulta anche: