Spark ML Transformer - 使用 rangeBetween 在 window 上聚合

Spark ML Transformer - aggregate over a window using rangeBetween

我想创建自定义 Spark ML Transformer,它使用构造 over window 在滚动 window 中应用聚合函数。我希望能够在 Spark ML Pipeline 中使用这个转换器。

我想实现一些可以用 withColumn 很容易完成的事情,正如这个答案中给出的

例如:

val w = Window.orderBy(col("unixTimeMS")).rangeBetween(0, 700)
val df_new = df.withColumn("cts", sum("someColumnName").over(w))

在哪里

是否可以将这样的 window 聚合放入 Spark ML Transformer 中?

我能够使用 Spark ML SQLTransformer 实现类似的东西,其中

val query = """SELECT *,
              sum(someColumnName) over (order by unixTimeMS) as cts
              FROM __THIS__"""

new SQLTransformer().setStatement(query)

但是我不知道如何在SQL到select的时间段内使用rangeBetween。不仅仅是行数。我需要关于当前行的 unixTimeMS 的特定时间段。

我知道一元变换不是这样做的方法,因为我需要进行聚合。我是否需要定义一个 UDAF(用户定义的聚合函数)并在 SQLTransformer 中使用它? 我找不到任何包含 window 函数的 UDAF 示例。

我正在回答我自己的问题以备将来参考。我最终使用了 SQLTransformer。就像示例中的 window 函数一样,我使用范围介于:

val query = SELECT *,
sum(dollars) over (
      partition by Numerocarte
      order by UnixTime
      range between 1000 preceding and 200 following) as cts
      FROM __THIS__"

其中 1000 和 200 之间的范围与按列排序的单位有关。