>>> 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]
Es gibt zwei id: bigint
und ich möchte einen löschen. Wie kann ich?
apache-spark
apache-spark-sql
pyspark
xjx0524
quelle
quelle
ndf = df.drop('age')
Wenn Sie die Antwort von @ Patrick hinzufügen, können Sie Folgendes verwenden, um mehrere Spalten zu löschen
columns_to_drop = ['id', 'id_copy'] df = df.drop(*columns_to_drop)
quelle
TreeNodeException: Binding attribute, tree: _gen_alias_34#34
nachdem ich eine Spalte.show()
Eine einfache Möglichkeit , dies zu tun ist , um Benutzer „
select
“ und erkennen Sie eine Liste aller bekommencolumns
für dasdataframe
,df
mitdf.columns
drop_list = ['a column', 'another column', ...] df.select([column for column in df.columns if column not in drop_list])
quelle
df.select([df.columns[column_num] for column_num in range(len(df.columns)) if column_num!=2])
zu entfernen, in der die Spalte, die ich entfernen möchte, den Index 2 hat.Sie können die Spalten, die Sie behalten möchten, entweder explizit benennen, wie folgt:
Oder in einem allgemeineren Ansatz würden Sie alle Spalten außer einer bestimmten über ein Listenverständnis einschließen. Zum Beispiel so (ohne die
id
Spalte vonb
):keep = [a[c] for c in a.columns] + [b[c] for c in b.columns if c != 'id']
Schließlich treffen Sie eine Auswahl für Ihr Join-Ergebnis:
d = a.join(b, a.id==b.id, 'outer').select(*keep)
quelle
keep = [c for c in a.columns] + [c for c in b.columns if c != 'id']
d = a.join(b, a.id==b.id, 'outer').select(*keep)
select
entweder Zeichenfolgen ODER Spalten akzeptiert werden ( spark.apache.org/docs/latest/api/python/… ). Übrigens müssen Sie in Ihrer Zeilekeep = ...
kein Listenverständnis verwenden füra
:a.columns + [c for c in b.columns if c != 'id']
sollte genau das Gleiche erreichen, wiea.columns
es bereits einelist
von Zeichenfolgen ist.id
Spalte nicht lösen würde . In diesem Fall müssen Sie dieColumn
Instanzen in verwendenselect
.Sie können zwei Möglichkeiten verwenden:
1: Sie behalten nur die erforderlichen Spalten:
drop_column_list = ["drop_column"] df = df.select([column for column in df.columns if column not in drop_column_list])
2: Dies ist der elegantere Weg.
df = df.drop("col_name")
Sie sollten die collect () -Version vermeiden, da sie den gesamten Datensatz an den Master sendet und einen hohen Rechenaufwand erfordert!
quelle
Vielleicht ein bisschen abseits des Themas, aber hier ist die Lösung mit Scala. Erstellen Sie einen
Array
Spaltennamen aus IhremoldDataFrame
und löschen Sie die Spalten, die Sie löschen möchten("colExclude")
. Dann passieren dieArray[Column]
aufselect
und entpacken Sie es.val columnsToKeep: Array[Column] = oldDataFrame.columns.diff(Array("colExclude")) .map(x => oldDataFrame.col(x)) val newDataFrame: DataFrame = oldDataFrame.select(columnsToKeep: _*)
quelle
Betrachten Sie 2 dataFrames:
>>> aDF.show() +---+----+ | id|datA| +---+----+ | 1| a1| | 2| a2| | 3| a3| +---+----+
und
>>> bDF.show() +---+----+ | id|datB| +---+----+ | 2| b2| | 3| b3| | 4| b4| +---+----+
Um das zu erreichen, wonach Sie suchen, gibt es zwei Möglichkeiten:
1. Unterschiedliche Verbindungsbedingungen. Anstatt aDF.id == bDF.id zu sagen
aDF.join(bDF, aDF.id == bDF.id, "outer")
Schreib Dies:
aDF.join(bDF, "id", "outer").show() +---+----+----+ | id|datA|datB| +---+----+----+ | 1| a1|null| | 3| a3| b3| | 2| a2| b2| | 4|null| b4| +---+----+----+
Dadurch wird der zusätzliche Löschvorgang automatisch beseitigt.
2. Verwenden Sie Aliasing: Sie verlieren Daten in Bezug auf B-spezifische IDs.
>>> 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| +----+----+----+
quelle
Sie können eine Spalte wie folgt löschen:
df.drop("column Name).columns
In deinem Fall :
df.drop("id").columns
Wenn Sie mehr als eine Spalte löschen möchten, haben Sie folgende Möglichkeiten:
dfWithLongColName.drop("ORIGIN_COUNTRY_NAME", "DEST_COUNTRY_NAME")
quelle