Если вы действительно хотите использовать несколько операций над одним окном, вы можете использовать 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.
Обычно в вашем случае данные перераспределяются только один раз, после первого окна функция. Поэтому любое беспокойство по поводу перемещения данных и производительности здесь не имеет значения.