この質問は新しいものではありませんが、私はSparkで驚くべき動作を見出しています。行IDの列をDataFrameに追加する必要があります。私はDataFrameメソッドmonotonically_increasing_id()を使用して、それは私にユニーク行ID(それは連続していないが、一意である)の追加の列を与えます。Spark DataFrameに行IDの永続列を追加するにはどうすればよいですか?
私が抱えている問題は、DataFrameをフィルタリングすると、結果のDataFrameの行IDが再割り当てされるということです。 2つのDataFramesを以下に示します。
最初のものは、以下のように行IDを持つ最初のデータフレームが追加された:
df.withColumn("rowId", monotonically_increasing_id())
第DATAFRAMEは
df.filter(col("P"))
介しCOL Pにフィルタリングした後に得られたものです。
問題は、初期データフレームに5たCUSTID 169のためのROWID、によって示されるが、CUSTID 169を除外した場合、ROWID(5)custmId 773に再割り当てされたことフィルタリング後です!なぜこれがデフォルトの動作であるのかわかりません。
私はrowIds
を「粘着性」にしたいと思います。私がDataFrameから行を削除した場合、IDを再利用したくないので、行を削除しすぎてしまいます。それは可能ですか? monotonically_increasing_id
メソッドからこの動作を要求するフラグはありません。
+---------+--------------------+-------+
| custId | features| P |rowId|
+---------+--------------------+-------+
|806 |[50,5074,...| true| 0|
|832 |[45,120,1...| true| 1|
|216 |[6691,272...| true| 2|
|926 |[120,1788...| true| 3|
|875 |[54,120,1...| true| 4|
|169 |[19406,21...| false| 5|
after filtering on P:
+---------+--------------------+-------+
| custId| features| P |rowId|
+---------+--------------------+-------+
| 806|[50,5074,...| true| 0|
| 832|[45,120,1...| true| 1|
| 216|[6691,272...| true| 2|
| 926|[120,1788...| true| 3|
| 875|[54,120,1...| true| 4|
| 773|[3136,317...| true| 5|
2つのサンプルデータフレームを生成するための完全なコードを共有できますか?それは価値があるため、「独立した」マップステージを再配置できるSQLクエリの最適化による可能性があります。 –
ハメル、実際に私が投稿したもの以外の変形や行動はありません。表示されるデータフレームは、df.show()の結果です。この動作を非常に簡単に再現し、データフレームを作成し、上記のように行ID列を追加して、それにランダムなブール列を追加することができます。次に、その列をフィルタリングして、単調に増加していく行IDが、私が記述しているように「再利用」されている様子を見てください。 – Kai
@カイ私はそれを再現する最も簡単な方法は、単一のパーティションだけを使うことだと、実際に付け加えます。 – zero323