Spark - “部分”窗口函数

时间:2018-05-06 14:14:27

标签: apache-spark apache-spark-sql spark-dataframe

在Spark尝试做“部分”窗口功能。

提供架构 eventId,impressionTime,广告系列,收入,我想知道每个evenId过去4天内广告系列的收入总和。

最后,我只在最近3天插入。所以我不得不加载7天的数据(所以最早的事件有4天的时间窗口),问题是我还会计算出最终范围之外的事件。

小例子: 我有7天的数据(第1天,第2天,第3天,第4天,第5天,第6天,第7天7是更晚),在输出中只有几天:需要7,6,5。

我每4天需要一个窗口。所以我会加载所有的日子并为他们做窗口功能。最后我将只花3天时间。

当然这是非常低效的,因为我也计算了窗口 第4,3天......

有没有对某些数据做窗函数?

由于

1 个答案:

答案 0 :(得分:0)

window functions不提供一种方法,您只能通过该方法计算输入数据日期子集的聚合(第5天,第6天和第7天)。正如您所指出的那样,您无法预先过滤,因为第1天到第4天的数据是构建准确窗口聚合所必需的。

如果你想使用Spark窗口函数,那么你必须在进行窗口聚合后过滤第1天到第4天。

计算窗口聚合的另一种方法是使用简单的连接,根据数据的大小,偏斜和窗口函数的长度,这可能更有效。这不需要后过滤,因为这是通过预过滤和连接条件来处理的。

val df1 = spark.read.table("table1").filter(col("day").isin(Seq(5,6,7):_*))
val df2 = spark.read.table("table1").filter(col("day").isin(Seq(1,2,3,4,5,6,7):_*))

df1.
  join(df2, (df1("key1") === df2("key2")).and(df2("millisecond_ts").between(df1("millisecond_ts") - 1000*60*60*24*4, df1("millisecond_ts"))), "left")