我使用以下数据样本使用Spark测试Zeppelin:
import org.apache.spark.graphx._
import org.apache.spark.rdd.RDD
val vertexArray = Array(
(1L, ("Alice", 28)),
(2L, ("Bob", 27)),
(3L, ("Charlie", 65)),
(4L, ("David", 42)),
(5L, ("Ed", 55)),
(6L, ("Fran", 50))
)
val edgeArray = Array(
Edge(2L, 1L, 7),
Edge(2L, 4L, 2),
Edge(3L, 2L, 4),
Edge(3L, 6L, 3),
Edge(4L, 1L, 1),
Edge(5L, 2L, 2),
Edge(5L, 3L, 8),
Edge(5L, 6L, 3)
)
val vertexRDD: RDD[(Long, (String, Int))] = sc.parallelize(vertexArray)
val edgeRDD: RDD[Edge[Int]] = sc.parallelize(edgeArray)
val graph: Graph[(String, Int), Int] = Graph(vertexRDD, edgeRDD)
我注意到Zeppelin并不总是能够显示输出,即使代码在Spark-Shell中工作正常。下面是一个例子,任何想法如何解决这个问题?
graph.vertices.filter { case (id, (name, age)) => age > 30 }.foreach {
case (id, (name, age)) => println(s"$name is $age")
}
答案 0 :(得分:3)
这里真的无法解决。这只是一种预期的行为。 foreach
闭包内的代码在不在运行笔记本的驱动程序上的worker上执行。可以根据您的配置捕获其输出,但这不是您可以依赖的。
如果您想从驱动程序输出内容,最好的选择是collect
或转换toLocalIterator
并在本地迭代:
graph.vertices.filter { case (id, (name, age)) => age > 30 }.collect.foreach {
case (id, (name, age)) => println(s"$name is $age")
}