Wie füge ich Spark DataFrame eine persistente Spalte mit Zeilen-IDs hinzu?

Diese Frage ist nicht neu, aber ich finde überraschendes Verhalten in Spark. Ich muss einem DataFrame eine Spalte mit Zeilen-IDs hinzufügen. Ich habe die DataFrame-Methode monotonically_increasing_id () verwendet, und es gibt mir eine zusätzliche Spalte mit eindeutigen Zeilen-IDs (die übrigens NICHT aufeinander folgen, aber eindeutig sind).

Das Problem besteht darin, dass beim Filtern des DataFrames die Zeilen-IDs im resultierenden DataFrame neu zugewiesen werden. Die beiden DataFrames werden unten angezeigt.

der erste ist der ursprüngliche DataFrame mit den folgenden Zeilen-IDs:

df.withColumn("rowId", monotonically_increasing_id()) 

der zweite DataFrame ist derjenige, der nach dem Filtern in der Spalte P über @ erhalten wurdf.filter(col("P")).

Das Problem wird durch die rowId für custId 169 veranschaulicht, die im ursprünglichen DataFrame 5 war, aber nach dem Filtern wurde diese rowId (5) custmId 773 neu zugewiesen, als custId 169 herausgefiltert wurde! Ich weiß nicht, warum dies das Standardverhalten ist.

Ich möchte dasrowIds um "klebrig" zu sein; Wenn ich Zeilen aus dem DataFrame entferne, möchte ich nicht, dass ihre IDs "wiederverwendet" werden. Ich möchte, dass sie auch mit ihren Zeilen mitgehen. Ist das möglich? Ich sehe keine Flags, um dieses Verhalten von @ anzufordermonotonically_increasing_id Methode

+---------+--------------------+-------+
| 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|

Antworten auf die Frage(12)

Ihre Antwort auf die Frage