2016-11-16 146 views
1

我是Spark/Scala上的初學者。我想從數據集中選擇的數組中提取一個值(Double)。簡化的主要步驟如下所示。如何提取 最後一個值wpA中的每個值[Double]?類似於val p1 = wpA(1)。我未能通過wpA.toArray將其轉換爲正常數組。如何獲取WrappedArray中的元素:Dataset.select(「x」)。collect()的結果?

非常感謝您的幫助。

case class Event(eventId: Int, n_track: Int, px:ArrayBuffer[Double],py: ArrayBuffer[Double], pz: ArrayBuffer[Double],ch: ArrayBuffer[Int], en: ArrayBuffer[Double]) 
--- 
val rawRdd = sc.textFile("expdata/rawdata.bel").map(_.split("\n")) 
val eventRdd = rawRdd.map(x => buildEvent(x(0).toString)) 
val dataset = sqlContext.createDataset[Event](eventRdd) 
dataset.printSchema() 
    root 
     |-- eventId: integer (nullable = false) 
     |-- n_track: integer (nullable = false) 
     |-- px: array (nullable = true) 
     | |-- element: double (containsNull = false) 
     |-- py: array (nullable = true) 
     | |-- element: double (containsNull = false) 
     |-- pz: array (nullable = true) 
     | |-- element: double (containsNull = false) 
     |-- ch: array (nullable = true) 
     | |-- element: integer (containsNull = false) 
     |-- en: array (nullable = true) 
     | |-- element: double (containsNull = false) 

val dataFrame = dataset.select("px")  
val dataRow = dataFrame.collect()  
val wpA = dataRow(1)(0) 
println(wpA) 
     WrappedArray(-0.99205, 0.379417, 0.448819,.....) 

回答

4

當你寫:

val wpA = dataRow(1)(0) 

你得到Any類型的變量,因爲org.apache.spark.sql.Row.apply(Int)(這是在這裏呼籲的datarow(1)結果的方法),返回Any

由於您知道此行的第一項(索引= 0)的預期類型,因此您應該使用Row.getAs[T](Int)並指出您期望得到WrappedArray。然後,編譯器會知道wpA是一個數組,你就可以使用它的任何方法(包括apply方法接受一個int,並且可以使用括號只能叫):

import scala.collection.mutable 

val wpA = dataRow(1).getAs[mutable.WrappedArray[Double]](0) 
println(wpA) // WrappedArray(-0.99205, 0.379417, 0.448819,.....) 
println(wpA(0)) // -0.99205 
+0

這是所有關於[ mutable.WrappedArray [Double]](0)。謝謝:) – elarib

+0

謝謝@Tzach Zohar。你的解決方案對我也很有幫助 –

相關問題