2015-09-21 12 views
6

Tôi đang sử dụng Spark 1.3.1 và tôi tò mò tại sao Spark không cho phép sử dụng các phím mảng trên kết hợp phía bản đồ. Piece of combineByKey function:Tại sao Spark không cho phép kết hợp phía bản đồ với các khóa mảng?

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

Bạn có thể xin hãy giải thích? Bạn muốn làm gì với các phím? hoặc những gì bạn muốn chìa khóa mà bạn không thể? – TravisJ

Trả lời

7

Về cơ bản với cùng lý do tại sao default partitioner cannot partition array keys.

Scala Array chỉ là một wrapper xung quanh mảng Java và hashCode của nó không phụ thuộc vào một nội dung:

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 

Nó có nghĩa là hai mảng với chính xác cùng một nội dung không bằng nhau

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 

Do đó, không thể sử dụng Arrays làm khóa có ý nghĩa. Nếu bạn không tin tưởng chỉ cần kiểm tra những gì sẽ xảy ra khi bạn sử dụng Array như chìa khóa cho 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) 

Nếu bạn muốn sử dụng một bộ sưu tập như chính bạn nên sử dụng một cấu trúc dữ liệu bất biến như một Vector hoặc một List.

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

Xem thêm:

Các vấn đề liên quan