如何在WrappedArray中获取一个元素:Dataset.select(“x”)的结果.colle()?

时间:2016-11-16 08:51:03

标签: scala apache-spark

我是Spark / Scala的初学者。我想从数据集中选择的数组中提取一个值(Double)。简化的主要步骤如下所示。如何提取每个值[Double] 最后val wpA?像val p1 = wpA(1)之类的东西。我没能通过wpA.toArray将它转换为普通数组。

提前感谢您的帮助。

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,.....)

1 个答案:

答案 0 :(得分:6)

当你写:

val wpA = dataRow(1)(0)  

你得到一个Any类型的变量,因为org.apache.spark.sql.Row.apply(Int)(这是datarow(1)的结果在这里调用的方法),返回Any

由于您知道此行的第一个项目(index = 0)的预期类型,因此您应该使用Row.getAs[T](Int)并指出您期望WrappedArray。然后,编译器将知道wpA是一个数组,您将能够使用它的任何方法(包括采用int的apply方法,并且只能使用parens调用):

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