Spark: как объединить несколько оконных агрегаций, выполненных в одном скользящем окне - PullRequest
0 голосов
/ 27 февраля 2020

Я обрабатываю набор данных временного ряда, и мне нужно вычислить stddev, mean et c по скользящему окну (-100, +100).
Я заметил, что для каждого из них применяется оконное управление вычисления, даже если скользящее окно одинаково для всех этих.
Есть ли способ объединить все эти вычисления, чтобы было только одно окно, и все необходимые вычисляемые поля были получены для этого окна

  val w = Window.partitionBy("raw_data_field_id").orderBy("date_time_epoch").rowsBetween(-100,100)
  val rawdatax = rawdata
    .withColumn("valueSqrtStdDev", stddev_pop(col("valueSqrt")).over(w))
    .withColumn("valueSqrtMean", mean(col("valueSqrt")).over(w))
    ....

enter image description here

1 Ответ

1 голос
/ 27 февраля 2020

Если вы действительно хотите использовать несколько операций над одним окном, вы можете использовать UDF / UDAF.

Пример использования UDF:

val multipleAgg = udf{ (ls: Seq[Double]) =>
  //perform multiple aggregations
}

val w = Window.partitionBy("raw_data_field_id").orderBy("date_time_epoch").rowsBetween(-100,100)
val rawdatax = rawdata.withColumn("aggregated", multipleAgg(collect_list(col("valueSqrt")).over(w)))

Но с другой стороны, для производительности По этой причине я бы продолжал использовать встроенный API DataFrame, если это возможно. Возможно, вам будет интересно прочитать эту статью re: преимущества API DataFrame / Dataset по сравнению с UDF / UDAF.

Обычно в вашем случае данные перераспределяются только один раз, после первого окна функция. Поэтому любое беспокойство по поводу перемещения данных и производительности здесь не имеет значения.

...