我想创建自定义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示例。
答案 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之间的范围与按订单的单位相关。