2017-09-19 10 views
0

Contexte: J'ai une grande table avec des heures de connexion. Je veux calculer un nombre variable d'ouvertures de session dans une période spécifiée (par exemple 3600 secondes).Comment utiliser la clause spark-sql "range between" pour une opération de fenêtre avec sparklyr

Dans SQL/HQL je voudrais préciser ce que:

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 

Pour contourner ce problème dans sparklyr, nous pourrions écrire cela comme:

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

Je veux savoir s'il y a un moyen existant de sparklyr/dplyr de réaliser ceci. This issue relative à l'ajout de la fonction « window_frame » à dbplyr semble prometteur, mais je ne peux pas trouver un moyen de spécifier « plage entre », l'opération ci-dessous génère seulement « lignes entre » fenêtre:

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

Répondre

0

I créerait une colonne d'index en utilisant row_number(), puis utilisez ft_bucketizer() avec grand écart à tous les 3600 lignes, et enfin group_by() et tally() pour obtenir le nombre

Voici un exemple:

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()