非空Spark数据集不会执行

时间:2017-07-31 18:59:56

标签: apache-spark

我正在尝试从Spark 2.1作业(使用Scala 2.11)中读取Cassandra表(mykeyspace.mytable):

val myDataset = sqlContext
     .read
     .format("org.apache.spark.sql.cassandra")
     .options(Map("table" -> "mytable", "keyspace" -> "mykeyspace"))
     .load()

myDataset.show()

println(s"Ping and the count is: ${myDataset.count}")
myDataset.foreach(t => println("Weee"))
println("Pong")

运行时,控制台输出为:

+--------------+-----------+
|      username|modified_at|
+--------------+-----------+
|sluggoo-flibby|       null|
+--------------+-----------+

Ping and the count is: 1
Pong

所以 clearl 在此表中只有一条记录... 但为什么我的foreach循环“无效?”为什么我看不到我的“Weee”输出?

2 个答案:

答案 0 :(得分:2)

我猜你没有看到输出,因为println输出到worker的标准输出,而不是驱动程序。这是RDD(View RDD contents in Python Spark?)的常见错误,但它也适用于Dataset

你可以collect,但当然不建议使用大数据:

 myDataset.collect.foreach(t => println("Weee"))

答案 1 :(得分:0)

foreach操作不在本地计算机上运行..它在运行spark执行程序的远程计算机上运行。因此,println不会在本地计算机上执行,而是在远程执行程序上执行。

要将它打印在本地计算机上,您应该在数据框上收集并在驱动程序上运行数据框的所有数据(在本地计算机上运行)并在该本地集合上执行foreach,如下所示。

myDataset.collect.foreach(println)

注意:请谨慎使用collectRDD上的Dataframe。 collect将分布式集合中的所有数据下载到本地内存,这可能导致java.lang.OutOfMemoryError例外。