2015-09-21 5 views
6

Ich benutze Spark 1.3.1 und ich bin gespannt, warum Spark Array-Tasten bei der Kartenseite Kombination nicht erlaubt. Stück combineByKey function:Warum Spark keine kartenseitige Kombination mit Array-Schlüsseln erlaubt?

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

Können Sie bitte näher erläutern? Was willst du mit den Schlüsseln machen? oder was willst du eingeben, das kannst du nicht? – TravisJ

Antwort

7

Im Grunde aus dem gleichen Grund, warum default partitioner cannot partition array keys.

Scala Array ist nur ein Wrapper um Java-Array und seine hashCode hängt nicht von einem Inhalt:

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 

Es bedeutet, dass zwei Arrays mit exakt den gleichen Inhalt nicht gleich sind

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 

Als Ergebnis kann Arrays nicht als sinnvolle Schlüssel verwendet werden. Wenn Sie nicht überzeugt, nur überprüfen, was passiert, wenn Sie Array als Schlüssel für Scala verwenden Map:

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

Wenn Sie eine Sammlung als Schlüssel verwenden möchten, sollten Sie eine unveränderliche Datenstruktur wie ein Vector oder List verwenden.

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

Siehe auch:

Verwandte Themen