2017-09-27 109 views
0

我有一個數據幀,看起來像這樣:如何從數據集中獲取值並將其存儲在Scala值中?

scala> avgsessiontime.show() 
+-----------------+ 
|    avg| 
+-----------------+ 
|2.073455735838315| 
+-----------------+ 

我需要的價值2.073455735838315存儲在一個變量。我試着用

avgsessiontime.collect 

而是開始給我任務不能序列異常。所以爲了避免我開始使用foreachPitition。但我不知道如何提取數組變量中的值2.073455735838315。

scala> avgsessiontime.foreachPartition(x => x.foreach(println)) 
[2.073455735838315] 

但是,當我這樣做:

avgsessiontime.foreachPartition(x => for (name <- x) name.get(0)) 

我得到一個空白/空的結果。即使長度也是空的。

avgsessiontime.foreachPartition(x => for (name <- x) name.length) 

我知道name的類型爲org.apache.spark.sql.Row,那麼它應該返回這兩個結果。

+0

_「但開始給我任務不可序列化的異常。」_ < - 解決真正的問題不會引入新的(!)你可以粘貼異常+代碼?什麼是Spark版本? –

回答

2

您可能需要:

avgsessiontime.first.getDouble(0) 

這裏使用first提取對象,.getDouble(0)從對象中提取價值。


val df = Seq(2.0743).toDF("avg") 

df.show 
+------+ 
| avg| 
+------+ 
|2.0743| 
+------+ 

df.first.getDouble(0) 
// res6: Double = 2.0743 
+0

謝謝。剛剛嘗試過。我得到了「org.apache.spark.SparkException:任務不可序列化」。我想先(),採取(),收集()所有工作以相同的方式。此外,我正在運行這是火花外殼。 – cryp

+0

這對我有用。您可以嘗試重新啓動您的spark-shell,或者確保您沒有打開多個spark shell。 – Psidom

+1

我單獨運行我的代碼(不是作爲應用程序)以及您的建議工作。事實上,即使collect()工作。但作爲應用程序它沒有。我只是添加了對象匹配擴展了Serializable,它工作得很好!添加「擴展可序列化」是我猜的關鍵。 – cryp

0

rdddataframes/datasets分佈於自然界,並foreachforeachPartition是在執行人小號執行,對轉型本身執行人或dataframerdd返回任何東西。因此,如果您想將變量返回到驅動程序節點,那麼您將不得不使用collect

假如你有一個dataframe作爲

+-----------------+ 
|avg    | 
+-----------------+ 
|2.073455735838315| 
|2.073455735838316| 
+-----------------+ 

執行以下操作將打印所有的值,你可以在一個變量中存儲過

avgsessiontime.rdd.collect().foreach(x => println(x(0))) 

將打印

2.073455735838315 
2.073455735838316 

現在,如果你只想要第一個,那麼你可以做

avgsessiontime.rdd.collect()(0)(0) 

,這將給你

2.073455735838315 

我希望答案是有幫助的

0
scala> val df = spark.range(10) 
df: org.apache.spark.sql.Dataset[Long] = [id: bigint] 

scala> df.show 
+---+ 
| id| 
+---+ 
| 0| 
| 1| 
| 2| 
| 3| 
| 4| 
| 5| 
| 6| 
| 7| 
| 8| 
| 9| 
+---+ 
scala> val variable = df.select("id").as[Long].collect 
variable: Array[Long] = Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9) 

相同的方式,可以提取任何類型即雙,字符串的值。您只需在從df中選擇值時輸入數據類型。

相關問題