我在本地系统上使用Spark 1.4.0。每当我创建一个RDD并通过Spark的Scala shell调用它时,它工作正常。但是当我创建一个独立的应用程序并在RDD上调用'collect'操作时,我没有看到结果,尽管运行期间的Spark消息说已经为驱动程序设置了一定数量的字节: -
INFO Executor: Finished task 0.0 in stage 0.0 (TID 0). 1991 bytes result sent to driver
INFO Executor: Finished task 1.0 in stage 0.0 (TID 1). 1948 bytes result sent to driver
这是代码: -
object Test
{ def main(args:Array[String])
{
val conf = new SparkConf()
val sc = new SparkContext(conf)
val rdd1 = sc.textFile("input.txt")
val rdd2 = rdd1.map(_.split(",")).map(x=>( (x(0),x(1)) ))
rdd2.collect
}
}
如果我将最后一个语句更改为以下语句,它会显示结果: -
rdd2.collect.foreach(println)
所以问题是,为什么只调用'collect'不打印任何内容?
答案 0 :(得分:2)
collect
本身在控制台应用程序上不会显示任何内容,因为它只是返回数据。正如您使用foreach(println)
一样,您必须做一些事情才能显示它。或者,通常使用它,例如将其保存到磁盘。
现在,如果您要在spark-shell
(减去SparkContext
创建)中运行该代码,那么您确实会看到输出*,因为shell始终调用对象的toString
返回。
*注意toString
与foreach(println)
不同,因为shell会在某个时刻截断