Ein SQL Row_Number-Äquivalent für ein Spark-RDD abrufen
In SQL ermöglicht die Funktion row_number() die Generierung einer eindeutigen Zeilennummer für jede Zeile in einer partitionierten und geordneten Tabelle. Diese Funktionalität kann in Spark mithilfe von RDDs repliziert werden. In diesem Artikel wird beschrieben, wie dies erreicht wird.
Betrachten Sie ein RDD mit dem Schema (K, V), wobei V ein Tupel (col1, col2, col3) darstellt. Das Ziel besteht darin, eine neue RDD mit einer zusätzlichen Spalte zu erhalten, die die Zeilennummer für jedes Tupel darstellt, organisiert durch eine Partition auf Schlüssel K.
Erster Versuch
Ein gemeinsamer Der Ansatz besteht darin, das RDD zu sammeln und es mithilfe von Funktionen wie sortBy(), sortWith() oder sortByKey() zu sortieren. Diese Methode behält jedoch nicht den Partitionierungsaspekt der Funktion row_number() bei.
Partitionsbewusste Reihenfolge
Um partitionierte Zeilennummern zu erreichen, können Sie Window-Funktionen nutzen im Spark. Allerdings sind Window-Funktionen in erster Linie für die Verwendung mit DataFrames und nicht für RDDs konzipiert.
Verwendung von DataFrames
Glücklicherweise ist ab Spark 1.4 die Funktion row_number() für DataFrames verfügbar . Folgen Sie diesem Beispiel:
# Create a test DataFrame testDF = sc.parallelize( (Row(k="key1", v=(1,2,3)), Row(k="key1", v=(1,4,7)), Row(k="key1", v=(2,2,3)), Row(k="key2", v=(5,5,5)), Row(k="key2", v=(5,5,9)), Row(k="key2", v=(7,5,5)) ) ).toDF() # Add the partitioned row number (testDF .select("k", "v", F.rowNumber() .over(Window .partitionBy("k") .orderBy("k") ) .alias("rowNum") ) .show() )
Dadurch wird ein DataFrame mit den partitionierten Zeilennummern generiert.
Das obige ist der detaillierte Inhalt vonWie repliziere ich die Funktion row_number() von SQL in Spark mithilfe von RDDs?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!