Comment puis-je ajouter un persistante de la colonne d'id de ligne à Étincelle DataFrame?

Cette question n'est pas nouvelle, mais je viens de trouver du comportement surprenant dans Spark. J'ai besoin d'ajouter une colonne d'Id de ligne à un DataFrame. J'ai utilisé le DataFrame méthode monotonically_increasing_id() et Il me donne un supplément de col de uniques Id de ligne (qui ne sont PAS consécutives, par la manière, mais unique).

Le problème, je vais avoir, c'est que lorsque je filtre le DataFrame l'Id de ligne dans le DataFrame sont ré-attribués. Les deux DataFrames sont présentés ci-dessous.

  • la première est l'initiale DataFrame avec Id de ligne ajouté comme suit:

    df.withColumn("rowId", monotonically_increasing_id()) 
    
  • la deuxième DataFrame est celui obtenu après filtrage sur le col P via df.filter(col("P")).

Le problème est illustré par le rowId pour custId 169, qui était de 5 dans la première DataFrame, mais après filtrage rowId (5), a été attribué à custmId 773 quand custId 169 a été filtré! Je ne sais pas pourquoi c'est le comportement par défaut.

Je voudrais que la rowIds être "collante"; si je supprimer des lignes de la DataFrame je ne veux pas leur Id "ré-utilisé", je veux allé trop avec leurs lignes. Est-il possible de faire cela? Je ne vois pas de drapeaux à la demande de ce comportement de monotonically_increasing_id méthode.

+---------+--------------------+-------+
| 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|
  • Pourriez-vous partager votre code complet pour générer les deux exemples de DataFrames? Pour ce que ça vaut, c'est probablement dû à la requête SQL d'optimisation qui prend lieu dans lequel "indépendant" la carte des étapes peut être modifié.
  • Hamel, il n'y a vraiment pas d'autres transformations ou de l'action que j'ai posté. Les trames de données indiquées sont le résultat de df.show(). Vous pouvez très facilement recréer ce problème, créez un bloc de données et ajouter un numéro de rangée de colonnes comme ci-dessus, puis ajouter un booléen aléatoire colonne à elle. Puis on le filtre sur la colonne et de voir comment l'Id de ligne, vous obtenez de plus en plus monotone sont "re-utilisé" comme je l'ai décrit.
  • En fait, je peux ajouter que la façon la plus simple de le reproduire est de n'utiliser qu'une seule partition.
  • Question sur l'Étincelle tracker pour ceci: SPARK-14241
  • Merci Nick pour la prise de cette place.
  • Ce problème est d'obtenir fixe Spark 2.1.0. Voir SPARK-14393 et le lien de la Srp.
  • Nice. Merci pour la mise à jour du thread.

InformationsquelleAutor Kai | 2016-02-29