我正在尝试从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”输出?
答案 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)
注意:请谨慎使用collect
或RDD
上的Dataframe
。 collect将分布式集合中的所有数据下载到本地内存,这可能导致java.lang.OutOfMemoryError
例外。