2017-07-31 29 views
0

我試圖從(使用Scala的2.11)時,Spark 2.1工作中讀取卡桑德拉表(mykeyspace.mytable):非空星火數據集的foreach不執行

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

你應該告訴你自己關於spark –

+0

的基礎知識謝謝@RaphaelRoth這是一個沒有大多數控制檯實現的twenry胡蘿蔔。 – smeeb

回答

1

我猜你看不到輸出,因爲println輸出到工人的標準輸出,而不是驅動。這是RDD常見的錯誤(View RDD contents in Python Spark?),但它也適用於Dataset

您可以collect,但它當然也不適合大數據:

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

在foreach操作不會在本地計算機上運行..它運行在遠程機器上您的火花執行人運行。因此println不是在本地機器上執行,而是在遠程執行器上執行。

要將其打印在本地機器上,您應該在數據框中收集數據,並在驅動程序(在本地計算機上運行)上擁有數據框的所有數據,並對該本地集合執行foreach,如下所示。

myDataset.collect.foreach(println) 

注意:小心上一個RDDDataframe使用collect。收集從分佈式集合下載的所有數據到本地內存,這可能會導致java.lang.OutOfMemoryError例外。