我是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,.....)
答案 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