2017-09-19 2 views
0

Kontext: Ich habe eine große Tabelle mit Anmeldezeiten. Ich möchte eine rollende Anzahl von Anmeldungen innerhalb eines bestimmten Zeitraums (z. B. 3600 s) berechnen.Wie verwende ich die Spark-sql "Bereich zwischen" -Klausel für eine Fensteroperation mit Sparklyr

In SQL/HQL i dies als angeben würde:

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 

Als Abhilfe können in sparklyr, könnten wir dies als schreiben:

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

Ich möchte wissen, ob es eine ist existierender sparklyr/dplyr-Weg, um dies zu erreichen. This issue in Bezug auf das Hinzufügen der „window_frame“ -Funktion dbplyr sieht vielversprechend aus, aber ich kann nicht einen Weg geben „Bereich zwischen“, die unter Betrieb finden erzeugt nur eine „Zeilen zwischen“ Fenster:

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

Antwort

0

I schaffen würde bei jedem 3600 Zeilen eine Indexspalte row_number() verwenden, dann ft_bucketizer() mit Splits verwendet werden, und schließlich group_by() und tally() die Zählung

Hier ein Beispiel zu bekommen:

split_by <- c(1, ((1:9* 10) + 1), 100) 

sample_flights %>% 
    head(100) %>% 
    mutate(order = as.double(row_number(DayofMonth))) %>% 
    ft_bucketizer("order", "bucket", splits = split_by) %>% 
    group_by(bucket) %>% 
    tally() 
Verwandte Themen