2016-11-16 21 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

あなたが書いた:org.apache.spark.sql.Row.apply(Int)は(datarow(1)の結果に、ここで呼び出されるメソッドである)、Anyを返すため

val wpA = dataRow(1)(0) 

あなたは、タイプAnyの変数を取得します。

この行の最初のアイテム(index = 0)の予想されるタイプを知っているので、Row.getAs[T](Int)を使用し、WrappedArrayが必要であることを示してください。その後、コンパイラはwpAが配列であることを知っているだろうと、あなたは(int型を取り、括弧のみを使用して呼び出すことができapply方法を含む)、そのメソッドのいずれかを使用することができます:

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。あなたのソリューションは本当に私を助けました –

関連する問題