Funke und SparkSQL: Wie zu imitieren-Fenster-Funktion?
Beschreibung
Gegeben ein dataframe df
id | date
---------------
1 | 2015-09-01
2 | 2015-09-01
1 | 2015-09-03
1 | 2015-09-04
2 | 2015-09-04
Ich möchte erstellen Sie eine laufende Zähler oder index,
- gruppiert, die von der gleichen id und
- nach Datum sortiert in einer Gruppe,
damit
id | date | counter
--------------------------
1 | 2015-09-01 | 1
1 | 2015-09-03 | 2
1 | 2015-09-04 | 3
2 | 2015-09-01 | 1
2 | 2015-09-04 | 2
Dies ist etwas, das ich erreichen kann mit der Fenster-Funktion, z.B.
val w = Window.partitionBy("id").orderBy("date")
val resultDF = df.select( df("id"), rowNumber().over(w) )
Leider Spark 1.4.1 nicht unterstützt window-Funktionen für regelmäßige dataframes:
org.apache.spark.sql.AnalysisException: Could not resolve window function 'row_number'. Note that, using window functions currently requires a HiveContext;
Fragen
- Wie kann ich das erreichen der obigen Berechnung auf die aktuelle Spark 1.4.1 ohne mit dem Fenster funktioniert?
- Wann wird der window-Funktion für die regelmäßige dataframes werden unterstützt in der Funke?
Dank!
- Tun Sie verwenden müssen, dataframes & SQL -, oder könnten Sie verwenden RDDs? Dies ist ganz einfach mit der groupBy-Methode.
- RDDs wäre auch in Ordnung. Können Sie bitte skizzieren Sie Ihre Idee mit einer kleinen code-Auszug? Als der SparkSQL ich sehe momentan keinen Weg, wie dies zu tun: haben Sie eine Idee?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie dies mit RDDs. Persönlich finde ich die API für RDDs macht viel mehr Sinn - ich weiß nicht immer wollen, dass meine Daten zu "flach", wie ein dataframe.
Den oben ergeben sich wie folgt:
Wenn Sie möchten, dass die position innerhalb der "Gruppe" als gut, können Sie verwenden
zipWithIndex
.Du könnte glätten Sie diese zurück, um eine einfache Liste/Array von
Row
Objekte mit FlatMap, aber wenn Sie brauchen, um alles auf die 'Gruppe', die nicht eine große Idee sein.Der Nachteil bei der Verwendung der RDD ist, dass es mühsam konvertieren von DataFrame zu RDD und wieder zurück.
list
Operationen, sobald diegroupBy
gemacht wurde ....Können Sie
HiveContext
für lokaleDataFrames
so gut und, es sei denn, Sie haben einen sehr guten Grund, nicht zu, ist es wahrscheinlich eine gute Idee, sowieso. Es ist ein Standard -SQLContext
erhältlich inspark-shell
undpyspark
shell (wie jetztsparkR
scheint einfachSQLContext
) und dessen parser-empfohlen von Spark SQL und DataFrame Guide.Ich bin völlig einverstanden, dass die Fenster-Funktionen für DataFrames sind der Weg zu gehen, wenn Sie Spark version (>=)1.5. Aber wenn Sie wirklich stecken, die mit einer älteren version(e.g 1.4.1), hier ist ein hacky Weg, um dieses Problem zu lösen
Nun, wenn Sie
dfWithCounter.show
Erhalten Sie:
Beachten Sie, dass
date
ist nicht sortiert, aber diecounter
korrekt ist. Sie können auch ändern, die Reihenfolge dercounter
durch ändern der<=
zu>=
imwhere
- Anweisung.