Scala: средний UDF для столбца фрейма данных, разделенного соседними столбцами - PullRequest
0 голосов
/ 18 октября 2019

У меня есть DataFrame со столбцами "id", "Month", "Day", "Hour" и "value". Я хочу сгруппировать / разделить по id, Month и Hour и выполнить медиану для столбца значения так, чтобыУ меня есть ежедневная медиана в час за каждый месяц. У меня есть UDF, который может рассчитать медиану:

def medianCalculator(seq: Seq[Int]): Int = {
  val sortedSeq = seq.sortWith(_ < _)

  if (seq.size % 2 == 1) sortedSeq(sortedSeq.size / 2)
  else {
    val (up, down) = sortedSeq.splitAt(seq.size / 2)
    (up.last + down.head) / 2
  }
}

Взято из здесь

Я могу применить это ко всему столбцу и получить результат, используя:

val output = df.select("value").collect().flatMap(_.toSeq).toSeq.map(_.toString.toInt)

Однако я не могу определить метод, который разделяет по «id», «Month» и «Hour» и возвращает медиану «value» после группировки / разделения в новом столбце.

РЕДАКТИРОВАТЬ:

Добавлен столбец "День" выше и комментарий о ежедневной медиане в час для каждого месяца.

1 Ответ

0 голосов
/ 18 октября 2019

В вашем вопросе не так много вопросов, но вот пара строк, которые укажут вам правильное направление.

val medianUDF = udf(medianCalculator)

val output = df
  .groupBy($"id", $"Month", $"Hour")
  .agg(collect_list($"value").as("values"))
  .select($"id", $"Month", $"Hour", medianUDF($"values"))
...