2015-10-19 33 views
9

Mam Spark SQL DataFrame z danymi, a próbuję uzyskać wszystkie wiersze poprzedzające bieżący wiersz w danym zakresie dat. Na przykład chcę mieć wszystkie wiersze od 7 dni wstecz poprzedzających dany wiersz. I zorientowali się, że trzeba użyć Window Function jak:Funkcje programu Spark Window - zakres pomiędzy datami

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

i tu pojawia się problem. Chcę mieć rangeBetween 7 dni, ale nie ma niczego w dokumentach Sparka, które mogłem znaleźć na ten temat. Czy Spark zapewnia taką opcję? Na razie jestem po prostu coraz wszystkie powyższe wiersze z:

.rowsBetween(-sys.maxsize, 0) 

ale chciałby osiągnąć coś takiego:

.rangeBetween("7 days", 0) 

Jeśli ktoś może mi pomóc w tej jednej będę bardzo wdzięczny. Z góry dziękuję!

Odpowiedz

21

O ile mi wiadomo, nie jest to możliwe bezpośrednio ani w Spark, ani w Hive. Oba wymagają użycia klauzuli ORDER BY używanej z RANGE jako wartości numerycznej. Najbliższą rzeczą, jaką znalazłem, jest konwersja na sygnaturę czasową i działanie w ciągu kilku sekund. Zakładając start kolumna zawiera date typ:

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

mały pomocnik i okno Definicja:

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 

Wreszcie zapytanie:

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| 
## +---+----------+----------+------------------+ 

Daleko od ładne, ale działa.


* Hive Language Manual, Types

+0

dziękuję, myślałem o czymś podobnym, dobrze mieć to potwierdzone! – Nhor