Извлечь массив [T] из кадра данных Spark в Scala - PullRequest
1 голос
/ 08 апреля 2020

Я пытаюсь найти определенный массив (типа Double) на основе другого столбца с минимальным значением. Следующий код работает для извлечения массива, но я не могу получить его как Array[Double]. Пробовал сопоставление и приведение от найденных из других потоков, но не смог решить проблему. Буду благодарен за любые подсказки. Вот иллюстрация:

scala> df.show
+----+---------------+
|time|           crds|
+----+---------------+
|12.0|[0.1, 2.1, 1.2]|
| 8.0|[1.1, 2.1, 3.2]|
| 9.0|[1.1, 1.1, 2.2]|
+----+---------------+


scala> val minTime = df.select(min(col("time"))).collect()(0)(0).toString.toDouble
minTime: Double = 8.0

scala> val crd = df.filter($"time" === minTime).select($"crds").take(1)
crd: Array[org.apache.spark.sql.Row] = Array([WrappedArray(1.1, 2.1, 3.2)])

scala> val res: Array[Double] = crd.array
<console>:29: error: type mismatch;
 found   : Array[org.apache.spark.sql.Row]
 required: Array[Double]
   val res: Array[Double] = crd.array
                                ^

scala>

Ответы [ 2 ]

1 голос
/ 08 апреля 2020
...
import scala.collection.mutable.WrappedArray
val crd = df.filter...select($"v").first.getAs[WrappedArray[Double]](0).toArray
1 голос
/ 08 апреля 2020

Может быть, но громоздко, но работает, если предположить, что есть только один удар как минимум.

scala> val df = Seq(
     |    (12.0, Array(0.1, 2.1, 1.2)),
     |    (8.0, Array(1.1, 2.1, 3.2)),
     |    (9.0, Array(1.1, 1.1, 2.2))
     | ).toDF("time", "crds")
df: org.apache.spark.sql.DataFrame = [time: double, crds: array<double>]

scala> val minTime = df.select(min(col("time"))).collect()(0)(0).toString.toDouble
minTime: Double = 8.0

scala> val crd = df.filter($"time" === minTime).select(explode(col("crds"))).collect().map(i => i(0)).map(_.toString.toDouble)
crd: Array[Double] = Array(1.1, 2.1, 3.2)

scala>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...