Spark ML Transformer - 使用rangeBetween在窗口上聚合

时间:2017-11-03 15:20:00

标签: scala apache-spark-sql spark-dataframe window-functions apache-spark-ml

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

我想通过本回答中给出的withColumn轻松完成一些事情

Spark Window Functions - rangeBetween dates

例如:

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

其中

  • df是我的数据框
  • unixTimeMS是以毫秒为单位的unix时间
  • someColumnName是我要执行聚合的一些列。 在这个例子中,我对窗口中的行进行了总结。
  • 窗口w包括当前事务以及当前事务700毫秒内的所有事务。

是否可以将这种窗口聚合放入Spark ML Transformer?

我能够通过Spark ML SQLTransformer获得与

类似的东西
val query = """SELECT *,
              sum(someColumnName) over (order by unixTimeMS) as cts
              FROM __THIS__"""

new SQLTransformer().setStatement(query)

但是我无法弄清楚如何在SQL中使用rangeBetween来选择一段时间。不仅仅是行数。我需要关于当前行的unixTimeMS的特定时间段。

我理解Unary Transforme不是这样做的,因为我需要制作一个聚合。我是否需要定义UDAF(用户定义的聚合函数)并在SQLTransformer中使用它? 我无法找到任何包含窗口函数的UDAF示例。

1 个答案:

答案 0 :(得分:0)

我正在回答我自己的问题以供将来参考。我最终使用了SQLTransformer。就像我在下面使用范围的示例中的窗口函数一样:

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之间的范围与按订单的单位相关。