2015-10-19 15 views
9

Sto avendo uno Spark SQL DataFrame con i dati e quello che sto cercando di ottenere sono tutte le righe precedenti alla riga corrente in un dato intervallo di date. Quindi per esempio voglio avere tutte le righe da 7 giorni precedenti la riga data. Ho capito che ho bisogno di usare un Window Function come:Spark Window Functions - range Between date

Window \ 
    .partitionBy('id') \ 
    .orderBy('start') 

e qui viene il problema. Voglio avere un rangeBetween 7 giorni, ma non c'è nulla nei documenti Spark che potrei trovare su questo. Spark fornisce anche questa opzione? Per ora sto solo ricevendo tutte le righe precedenti con:

.rowsBetween(-sys.maxsize, 0) 

ma vorrei realizzare qualcosa di simile:

.rangeBetween("7 days", 0) 

Se qualcuno mi può aiutare su questo sarò molto grato. Grazie in anticipo!

risposta

21

Per quanto ne so non è possibile direttamente né in Spark né in Hive. Entrambi richiedono la clausola ORDER BY utilizzata con RANGE come numerico. La cosa più vicina che ho trovato è la conversione in data e ora e il funzionamento in secondi. Supponendo start colonna contiene date Tipo:

from pyspark.sql import Row 

row = Row("id", "start", "some_value") 
df = sc.parallelize([ 
    row(1, "2015-01-01", 20.0), 
    row(1, "2015-01-06", 10.0), 
    row(1, "2015-01-07", 25.0), 
    row(1, "2015-01-12", 30.0), 
    row(2, "2015-01-01", 5.0), 
    row(2, "2015-01-03", 30.0), 
    row(2, "2015-02-01", 20.0) 
]).toDF().withColumn("start", col("start").cast("date")) 

Un aiuto e la finestra piccola definizione:

from pyspark.sql.window import Window 
from pyspark.sql.functions import mean, col 


# Hive timestamp is interpreted as UNIX timestamp in seconds* 
days = lambda i: i * 86400 

Infine query:

w = (Window() 
    .partitionBy(col("id")) 
    .orderBy(col("start").cast("timestamp").cast("long")) 
    .rangeBetween(-days(7), 0)) 

df.select(col("*"), mean("some_value").over(w).alias("mean")).show() 

## +---+----------+----------+------------------+ 
## | id|  start|some_value|    mean| 
## +---+----------+----------+------------------+ 
## | 1|2015-01-01|  20.0|    20.0| 
## | 1|2015-01-06|  10.0|    15.0| 
## | 1|2015-01-07|  25.0|18.333333333333332| 
## | 1|2015-01-12|  30.0|21.666666666666668| 
## | 2|2015-01-01|  5.0|    5.0| 
## | 2|2015-01-03|  30.0|    17.5| 
## | 2|2015-02-01|  20.0|    20.0| 
## +---+----------+----------+------------------+ 

Lungi dall'essere abbastanza, ma funziona.


* Hive Language Manual, Types

+0

grazie, pensavo a qualcosa di simile, bene avere confermato! – Nhor