>>> a
DataFrame[id: bigint, julian_date: string, user_id: bigint]
>>> b
DataFrame[id: bigint, quan_created_money: decimal(10,0), quan_created_cnt: bigint]
>>> a.join(b, a.id==b.id, 'outer')
DataFrame[id: bigint, julian_date: string, user_id: bigint, id: bigint, quan_created_money: decimal(10,0), quan_created_cnt: bigint]
Il y a deux id: bigint
et je veux en supprimer un. Comment puis-je faire?
En lisant la documentation Spark, j'ai trouvé une solution plus simple.
Depuis la version 1.4 de spark, il existe une fonction drop(col)
qui peut être utilisée dans pyspark sur un cadre de données.
Vous pouvez l'utiliser de deux manières
df.drop('age').collect()
df.drop(df.age).collect()
En ajoutant à la réponse de @ Patrick, vous pouvez utiliser ce qui suit pour supprimer plusieurs colonnes
columns_to_drop = ['id', 'id_copy']
df = df.drop(*columns_to_drop)
Un moyen facile de faire cela est d'utiliser l'utilisateur "select
" et de réaliser que vous pouvez obtenir une liste de tous les columns
du dataframe
, df
, avec df.columns
drop_list = ['a column', 'another column', ...]
df.select([column for column in df.columns if column not in drop_list])
Vous pouvez soit nommer explicitement les colonnes que vous souhaitez conserver, comme suit:
keep = [a.id, a.julian_date, a.user_id, b.quan_created_money, b.quan_created_cnt]
Ou, dans une approche plus générale, vous incluez toutes les colonnes sauf une spécifique via une liste de compréhension. Par exemple, comme ceci (en excluant la colonne id
de b
):
keep = [a[c] for c in a.columns] + [b[c] for c in b.columns if c != 'id']
Enfin, vous faites une sélection sur votre résultat de jointure:
d = a.join(b, a.id==b.id, 'outer').select(*keep)
Vous pouvez utiliser deux façons:
1: Vous ne gardez que les colonnes nécessaires:
drop_column_list = ["drop_column"]
df = df.select([column for column in df.columns if column not in drop_column_list])
2: C'est la manière la plus élégante.
df = df.drop("col_name")
Vous devriez éviter la version collect (), car elle enverra au maître l'intégralité du jeu de données, cela demandera un gros effort informatique!
Peut-être un peu hors sujet, mais voici la solution en utilisant Scala. Créez une Array
de noms de colonnes à partir de votre oldDataFrame
et supprimez les colonnes que vous souhaitez supprimer ("colExclude")
. Puis passez le Array[Column]
à select
et décompressez-le.
val columnsToKeep: Array[Column] = oldDataFrame.columns.diff(Array("colExclude"))
.map(x => oldDataFrame.col(x))
val newDataFrame: DataFrame = oldDataFrame.select(columnsToKeep: _*)
Vous pouvez supprimer une colonne comme ceci:
df.drop("column Name).columns
Dans ton cas :
df.drop("id").columns
Si vous voulez supprimer plus d'une colonne, vous pouvez faire:
dfWithLongColName.drop("Origin_COUNTRY_NAME", "DEST_COUNTRY_NAME")
Considérez 2 dataFrames:
>>> aDF.show()
+---+----+
| id|datA|
+---+----+
| 1| a1|
| 2| a2|
| 3| a3|
+---+----+
et
>>> bDF.show()
+---+----+
| id|datB|
+---+----+
| 2| b2|
| 3| b3|
| 4| b4|
+---+----+
Pour accomplir ce que vous recherchez, il y a 2 façons:
1. Différentes conditions de jonction. Au lieu de dire aDF.id == bDF.id
aDF.join(bDF, aDF.id == bDF.id, "outer")
Écrire cela:
aDF.join(bDF, "id", "outer").show()
+---+----+----+
| id|datA|datB|
+---+----+----+
| 1| a1|null|
| 3| a3| b3|
| 2| a2| b2|
| 4|null| b4|
+---+----+----+
Cela éliminera automatiquement le processus supplémentaire.
2. Utiliser le crénelage: Vous perdrez des données liées à un ID spécifique B dans ceci.
>>> from pyspark.sql.functions import col
>>> aDF.alias("a").join(bDF.alias("b"), aDF.id == bDF.id, "outer").drop(col("b.id")).show()
+----+----+----+
| id|datA|datB|
+----+----+----+
| 1| a1|null|
| 3| a3| b3|
| 2| a2| b2|
|null|null| b4|
+----+----+----+