Spark RDD と同等の SQL Row_Number を取得する
SQL では、row_number() 関数を使用して一意の行番号を生成できます。パーティション化され順序付けされたテーブルの各行に対して。この機能は、RDD を使用して Spark で複製できます。この記事では、これを実現する方法について概説します。
スキーマ (K, V) を持つ RDD を考えてみましょう。ここで、V はタプル (col1、col2、col3) を表します。目標は、キー K のパーティションによって編成された、各タプルの行番号を表す追加の列を持つ新しい RDD を取得することです。
First Attempt
1 つの共通アプローチは、RDD を収集し、sortBy()、sortWith()、または sortByKey() などの関数を使用して並べ替えることです。ただし、このメソッドは row_number() 関数のパーティション化の側面を維持しません。
パーティションを意識した順序付け
パーティション化された行番号を実現するには、ウィンドウ関数を利用できます。スパークで。ただし、Window 関数は主に RDD ではなく DataFrame で使用するように設計されています。
DataFrame の使用
幸いなことに、Spark 1.4 以降では、row_number() 機能が DataFrame で使用できます。 。次の例に従います:
# 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() )
これにより、分割された行番号を持つ DataFrame が生成されます。
以上がRDDを使用してSparkでSQLのrow_number()関数をレプリケートする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。