Questa domanda non è nuova, tuttavia trovo un comportamento sorprendente in Spark. Devo aggiungere una colonna di ID di riga a un DataFrame. Ho usato il metodo DataFrame monotonically_increasing_id() e mi fornisce un ulteriore col di ID di riga univoci (che NON sono consecutivi a proposito, ma sono unici).Come si aggiunge una colonna persistente di ID di riga a Spark DataFrame?
Il problema che sto avendo è che quando filtro il DataFrame gli ID di riga nel DataFrame risultante vengono riassegnati. I due DataFrames sono mostrati di seguito.
il primo è il dataframe iniziale con ID di riga aggiunti come segue:
df.withColumn("rowId", monotonically_increasing_id())
secondo dataframe è quello ottenuto dopo il filtraggio sul colle P tramite
df.filter(col("P"))
.
Il problema è illustrato dal rowId per IDCLIENTE 169, che era 5 nella dataframe iniziale, ma dopo il filtraggio che rowId (5) è stato riassegnato custmId 773 quando CustID 169 è stata filtrata su! Non so perché questo è il comportamento predefinito.
Vorrei che lo rowIds
fosse "appiccicoso"; se rimuovo le righe da DataFrame non voglio che i loro ID "riutilizzati", voglio che siano andati troppo avanti con le loro righe. è possibile farlo? Non vedo alcun flag per richiedere questo comportamento dal metodo 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|
Potrebbe condividere il codice completo per la generazione dei due esempi di DataFrames? Per quello che vale, questo è probabilmente dovuto all'ottimizzazione della query SQL che ha luogo in cui le fasi di mappa "indipendenti" possono essere riorganizzate. –
Hamel, non ci sono altre trasformazioni o azioni di quelle che ho pubblicato. I frame di dati mostrati sono il risultato di df.show(). È possibile ricreare facilmente questo comportamento, creare una cornice dati e aggiungere una colonna ID riga come sopra, quindi aggiungere una colonna booleana casualmente ad essa. Quindi filtra su quella colonna e vedi come gli ID di riga che ottieni da monotonicamente in aumento vengono "riutilizzati" come descrivo. – Kai
@Kai Vorrei davvero aggiungere che il modo più semplice per riprodurlo è quello di utilizzare solo una singola partizione. – zero323