Suppression des doublons de lignes en fonction des colonnes spécifiques dans un EDR/Spark DataFrame
Disons que j'ai une assez grande base de données dans le formulaire ci-dessous:
data = sc.parallelize([('Foo',41,'US',3),
('Foo',39,'UK',1),
('Bar',57,'CA',2),
('Bar',72,'CA',2),
('Baz',22,'US',6),
('Baz',36,'US',6)])
Ce que je voudrais faire est de supprimer les lignes en double sur la base des valeurs de la première,la troisième et la quatrième colonnes seulement.
De supprimer totalement les lignes en double est simple:
data = data.distinct()
et ligne 5 ou ligne 6 sera supprimé
Mais comment puis-je seulement supprimer les doublons de lignes basés sur des colonnes 1, 3 et 4 seulement? c'est à dire supprimer soit un, un de ces:
('Baz',22,'US',6)
('Baz',36,'US',6)
En Python, ce qui pourrait être fait en spécifiant les colonnes avec .drop_duplicates()
. Comment puis-je obtenir le même dans Spark/Pyspark?
Vous devez vous connecter pour publier un commentaire.
Pyspark ne comprennent un
dropDuplicates()
méthode. https://spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.DataFrame.dropDuplicatesPeut-être qu'il a été présenté dans une version ultérieure de ce que @Jason (OP) a l'aide d'?
edit: ouais, il a été introduit dans la version 1.4,
De votre question, il est difficile-pour les colonnes que vous souhaitez utiliser pour déterminer les doublons. L'idée générale derrière la solution est de créer une clé basée sur les valeurs des colonnes qui permettent d'identifier les doublons. Ensuite, vous pouvez utiliser le reduceByKey ou de réduire les opérations d'éliminer les doublons.
Voici un peu de code pour vous aider à démarrer:
Maintenant, vous avez une clé-valeur
RDD
qui sont saisies par les colonnes 1, 3 et 4.La prochaine étape serait un
reduceByKey
ougroupByKey
etfilter
.Cela permettrait d'éliminer les doublons.
Je sais que vous avez déjà accepté l'autre réponse, mais si vous voulez faire cela comme un
DataFrame, il suffit d'utiliser groupBy et agg. En supposant que vous avez eu une DF déjà créé (avec des colonnes nommées "col1", "col2", etc), vous pouvez faire:
Noter que dans ce cas, j'ai choisi le Max de col2, mais vous pourriez le faire avg, min, etc.
$"col1"
aveccol("col1")
etc.D'accord avec David. Pour ajouter, il peut pas être le cas que nous voulons groupBy toutes les colonnes autres que la colonne(s) en fonction d'agrégation j'.e, si nous voulons supprimer les doublons purement basée sur un sous-ensemble de colonnes et de conserver toutes les colonnes dans l'original dataframe. Donc, la meilleure façon de le faire pourrait être à l'aide de dropDuplicates Dataframe api disponible dans Spark 1.4.0
Pour référence, voir: https://spark.apache.org/docs/1.4.0/api/scala/index.html#org.apache.spark.sql.DataFrame
J'ai utilisé intégré la fonction dropDuplicates(). Scala code donné ci-dessous
De sortie :
Le programme ci-dessous vous aidera à déposer en double dans son ensemble , ou si vous voulez supprimer les doublons en fonction de certaines colonnes , vous pouvez même le faire:
C'est mon Df contient 4 est répété deux fois donc, ici, va supprimer des valeurs répétées.
df.dropDuplicates()
exemple, y compris comment il peut être appliqué à plus d'une colonne (ma question de départ).