我是Spark / Scala的初学者。我想从数据集中选择的数组中提取一个值(双精度)。简化的主要步骤如下所示。我如何提取每个值[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,.....)

最佳答案

当您写:

val wpA = dataRow(1)(0)

您将获得类型为Any的变量,因为org.apache.spark.sql.Row.apply(Int)(这是datarow(1)的结果在此处调用的方法)返回Any

由于您知道该行第一项的预期类型(索引= 0),因此应使用Row.getAs[T](Int)并指出您期望使用WrappedArray。然后,编译器将知道wpA是一个数组,您将能够使用其任何方法(包括采用int且只能使用parens调用的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

关于scala - 如何在WrappedArray中获取元素:Dataset.select (“x”).collect()的结果?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40627610/

10-10 21:19