非空 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

所以这个表中有一个清晰的记录...但是为什么我的foreach循环"不起作用"?为什么我看不到我的"Weee"输出?

我想你看不到输出,因为println输出到worker的标准输出,而不是驱动程序。这是RDD的常见错误(在Python Spark中查看RDD内容?(,但它也适用于Dataset

您可以collect,但对于大数据,当然不建议这样做:

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

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

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

myDataset.collect.foreach(println)

注意:在RDDDataframe上使用collect时要小心。 collect 会将所有数据从分布式集合下载到本地内存,这可能会导致java.lang.OutOfMemoryError异常。

最新更新