спарк DataFrame с использованием функции разнесения и описания - PullRequest
0 голосов
/ 13 июня 2018

У меня есть искровой DataFrame, имеющий 3 столбца (id: Int, x_axis: Array [Int], y_axis: Array [Int]) с некоторыми примерами данных ниже:

enter image description here

хочу получить базовую статистику столбца y_axis для каждой строки в кадре данных.Вывод будет выглядеть примерно так:

enter image description here

Я попытался взорвать, а затем описать, но не смог определить ожидаемый результат.Любая помощь или ссылка очень ценится

1 Ответ

0 голосов
/ 13 июня 2018

Как вы предлагаете, вы можете разбить столбец Y, а затем использовать окно поверх идентификатора, чтобы вычислить всю интересующую вас статистику. Тем не менее, вы хотите потом повторно объединить свои данные, чтобы вы могли получить огромный промежуточный результат бесплатно.,

Spark не имеет много предопределенных функций для массивов.Поэтому, вероятно, самый простой способ добиться того, чего вы хотите - это UDF:

val extractFeatures = udf( (x : Seq[Int]) => {
    val mean = x.sum.toDouble/x.size
    val variance = x.map(i=> i*i).sum.toDouble/x.size - mean*mean
    val std = scala.math.sqrt(variance)
    Map("count" -> x.size.toDouble, 
        "mean" -> mean, 
        "std" -> std, 
        "min" -> x.min.toDouble, 
        "max" -> x.max.toDouble)
})

val df = sc
    .parallelize(Seq((1,Seq(1,2,3,4,5)), (2,Seq(1,2,1,4))))
    .toDF("id", "y")
    .withColumn("described_y", extractFeatures('y))
    .show(false)

+---+---------------+---------------------------------------------------------------------------------------------+
|id |y              |described_y                                                                                  |
+---+---------------+---------------------------------------------------------------------------------------------+
|1  |[1, 2, 3, 4, 5]|Map(count -> 5.0, mean -> 3.0, min -> 1.0, std -> 1.4142135623730951, max -> 5.0, var -> 2.0)|
|2  |[1, 2, 1, 4]   |Map(count -> 4.0, mean -> 2.0, min -> 1.0, std -> 1.224744871391589, max -> 4.0, var -> 1.5) |
+---+---------------+---------------------------------------------------------------------------------------------+

И, кстати, вычисленный вами stddev на самом деле является дисперсией.Вам нужно взять квадратный корень, чтобы получить стандартное отклонение.

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