2017-06-06 2 views
2

In Spark-Sql Version 1.6, mit DataFrame s, gibt es eine Möglichkeit, für eine bestimmte Spalte die Summe der aktuellen Zeile und die nächste Zeile für jede Zeile zu berechnen?Wie berechnet man die aktuelle Zeile mit der nächsten?

Zum Beispiel, wenn ich eine Tabelle mit einer Spalte haben, wie so

Age 
12 
23 
31 
67 

würde Ich mag die folgende Ausgabe

Sum 
35 
54 
98 

Die letzte Reihe fallen gelassen wird, weil es keine „nächste hat Zeile "hinzugefügt werden.

Im Moment mache ich es, indem ich die Tabelle rangiere und sie mit sich selbst verbinde, wo rank gleich rank+1 ist.

Gibt es einen besseren Weg, dies zu tun? Kann dies mit einer Window Funktion gemacht werden?

Antwort

1

Ja definitiv können Sie mit Window Funktion mit rowsBetween Funktion tun. Ich habe in meinem folgenden Beispiel person Spalte für grouping Zweck verwendet.

import sqlContext.implicits._ 
import org.apache.spark.sql.functions._ 

val dataframe = Seq(
    ("A",12), 
    ("A",23), 
    ("A",31), 
    ("A",67) 
).toDF("person", "Age") 

val windowSpec = Window.partitionBy("person").orderBy("Age").rowsBetween(0, 1) 
val newDF = dataframe.withColumn("sum", sum(dataframe("Age")) over(windowSpec)) 
    newDF.filter(!(newDF("Age") === newDF("sum"))).show 
+0

Verwenden Sie 'Window.currentRow' anstatt –

+0

Danke. Könnten Sie sich bitte auch [diese Frage] (https://stackoverflow.com/q/44392754/416300) ansehen? – summerbulb

Verwandte Themen