我如何使用spark-sql“range between”子句与sparklyr进行窗口操作

时间:2017-09-19 11:32:00

标签: dplyr sparklyr dbplyr

上下文:我有一个包含登录时间的大表。我想计算在指定时间段内(例如3600秒)的滚动登录次数。

在SQL / HQL中,我将其指定为:

SELECT id, logon_time, COUNT(*) OVER(
  PARTITION BY id ORDER BY logon_time 
  RANGE BETWEEN 3600 PRECEDING AND CURRENT ROW) as window_count
FROM df

作为sparklyr中的一种解决方法,我们可以将其写为:

df %>%
  mutate(window_count = sql('COUNT(*) OVER(
      PARTITION BY id ORDER BY logon_time 
      RANGE BETWEEN 3600 PRECEDING AND CURRENT ROW'))

我想知道是否存在实现这一目标的闪烁/快速方式。 有关将“window_frame”函数添加到dbplyr的This issue看起来很有希望,但是我找不到指定“范围之间”的方法,下面的操作只生成“行之间”窗口:

df %>%
  group_by(id) %>%
  window_frame(-3600, 0) %>%
  window_order(logon_time) %>%
  mutate(windowed_count = n())

1 个答案:

答案 0 :(得分:0)

我会使用PGS.rollback conn创建一个索引列,然后使用row_number()每3600行进行一次拆分,最后ft_bucketizer()group_by()来获取计数

以下是一个例子:

tally()