aboutsummaryrefslogtreecommitdiff
path: root/graphx/src/test/scala
diff options
context:
space:
mode:
authorAnkur Dave <ankurdave@gmail.com>2014-06-05 23:33:12 -0700
committerReynold Xin <rxin@apache.org>2014-06-05 23:33:12 -0700
commit8d85359f84cc67996b4bcf1670a8a98ab4f914a2 (patch)
tree4d0be1cb9104031c56b14bbceb4c824eace3c6cd /graphx/src/test/scala
parent41db44c428a10f4453462d002d226798bb8fbdda (diff)
downloadspark-8d85359f84cc67996b4bcf1670a8a98ab4f914a2.tar.gz
spark-8d85359f84cc67996b4bcf1670a8a98ab4f914a2.tar.bz2
spark-8d85359f84cc67996b4bcf1670a8a98ab4f914a2.zip
[SPARK-1552] Fix type comparison bug in {map,outerJoin}Vertices
In GraphImpl, mapVertices and outerJoinVertices use a more efficient implementation when the map function conserves vertex attribute types. This is implemented by comparing the ClassTags of the old and new vertex attribute types. However, ClassTags store erased types, so the comparison will return a false positive for types with different type parameters, such as Option[Int] and Option[Double]. This PR resolves the problem by requesting that the compiler generate evidence of equality between the old and new vertex attribute types, and providing a default value for the evidence parameter if the two types are not equal. The methods can then check the value of the evidence parameter to see whether the types are equal. It also adds a test called "mapVertices changing type with same erased type" that failed before the PR and succeeds now. Callers of mapVertices and outerJoinVertices can no longer use a wildcard for a graph's VD type. To avoid "Error occurred in an application involving default arguments," they must bind VD to a type parameter, as this PR does for ShortestPaths and LabelPropagation. Author: Ankur Dave <ankurdave@gmail.com> Closes #967 from ankurdave/SPARK-1552 and squashes the following commits: 68a4fff [Ankur Dave] Undo conserve naming 7388705 [Ankur Dave] Remove unnecessary ClassTag for VD parameters a704e5f [Ankur Dave] Use type equality constraint with default argument 29a5ab7 [Ankur Dave] Add failing test f458c83 [Ankur Dave] Revert "[SPARK-1552] Fix type comparison bug in mapVertices and outerJoinVertices" 16d6af8 [Ankur Dave] [SPARK-1552] Fix type comparison bug in mapVertices and outerJoinVertices
Diffstat (limited to 'graphx/src/test/scala')
-rw-r--r--graphx/src/test/scala/org/apache/spark/graphx/GraphSuite.scala25
1 files changed, 25 insertions, 0 deletions
diff --git a/graphx/src/test/scala/org/apache/spark/graphx/GraphSuite.scala b/graphx/src/test/scala/org/apache/spark/graphx/GraphSuite.scala
index abc25d0671..6506bac73d 100644
--- a/graphx/src/test/scala/org/apache/spark/graphx/GraphSuite.scala
+++ b/graphx/src/test/scala/org/apache/spark/graphx/GraphSuite.scala
@@ -159,6 +159,31 @@ class GraphSuite extends FunSuite with LocalSparkContext {
}
}
+ test("mapVertices changing type with same erased type") {
+ withSpark { sc =>
+ val vertices = sc.parallelize(Array[(Long, Option[java.lang.Integer])](
+ (1L, Some(1)),
+ (2L, Some(2)),
+ (3L, Some(3))
+ ))
+ val edges = sc.parallelize(Array(
+ Edge(1L, 2L, 0),
+ Edge(2L, 3L, 0),
+ Edge(3L, 1L, 0)
+ ))
+ val graph0 = Graph(vertices, edges)
+ // Trigger initial vertex replication
+ graph0.triplets.foreach(x => {})
+ // Change type of replicated vertices, but preserve erased type
+ val graph1 = graph0.mapVertices {
+ case (vid, integerOpt) => integerOpt.map((x: java.lang.Integer) => (x.toDouble): java.lang.Double)
+ }
+ // Access replicated vertices, exposing the erased type
+ val graph2 = graph1.mapTriplets(t => t.srcAttr.get)
+ assert(graph2.edges.map(_.attr).collect.toSet === Set[java.lang.Double](1.0, 2.0, 3.0))
+ }
+ }
+
test("mapEdges") {
withSpark { sc =>
val n = 3