>>> 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]
Są dwa id: bigint
i chcę usunąć jeden. Jak mam to zrobić?
apache-spark
apache-spark-sql
pyspark
xjx0524
źródło
źródło
ndf = df.drop('age')
Dodając do odpowiedzi @ Patricka, możesz użyć poniższego, aby upuścić wiele kolumn
columns_to_drop = ['id', 'id_copy'] df = df.drop(*columns_to_drop)
źródło
TreeNodeException: Binding attribute, tree: _gen_alias_34#34
Po upuszczeniu kolumny pojawia się błąd i używam.show()
Łatwym sposobem, aby to zrobić, to użytkownik „
select
” i uświadomić sobie, można uzyskać listę wszystkichcolumns
dladataframe
,df
zdf.columns
drop_list = ['a column', 'another column', ...] df.select([column for column in df.columns if column not in drop_list])
źródło
df.select([df.columns[column_num] for column_num in range(len(df.columns)) if column_num!=2])
, gdzie kolumna Chcę usunąć posiada indeks 2.Możesz jawnie nazwać kolumny, które chcesz zachować, na przykład:
keep = [a.id, a.julian_date, a.user_id, b.quan_created_money, b.quan_created_cnt]
Lub w bardziej ogólnym podejściu uwzględnisz wszystkie kolumny z wyjątkiem konkretnej za pomocą rozumienia listy. Na przykład w ten sposób (z wyłączeniem
id
kolumny zb
):keep = [a[c] for c in a.columns] + [b[c] for c in b.columns if c != 'id']
Na koniec dokonujesz wyboru wyniku dołączenia:
d = a.join(b, a.id==b.id, 'outer').select(*keep)
źródło
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
akceptuje ciągi znaków LUB kolumny ( spark.apache.org/docs/latest/api/python/ ... ). Przy okazji, w twoim wierszukeep = ...
nie ma potrzeby używania wyrażenia listowego dlaa
:a.columns + [c for c in b.columns if c != 'id']
powinno osiągnąć dokładnie to samo, coa.columns
już jestlist
ze stringów.id
kolumny. W takim przypadku musisz użyćColumn
instancji wselect
.Możesz użyć dwóch sposobów:
1: Po prostu zachowaj niezbędne kolumny:
drop_column_list = ["drop_column"] df = df.select([column for column in df.columns if column not in drop_column_list])
2: To jest bardziej elegancki sposób.
df = df.drop("col_name")
Powinieneś unikać wersji collect (), ponieważ wyśle ona do mastera kompletny zestaw danych, będzie to wymagało dużego wysiłku obliczeniowego!
źródło
Może trochę poza tematem, ale oto rozwiązanie wykorzystujące Scala. Utwórz
Array
z nazw kolumn ze swojegooldDataFrame
i usuń kolumny, które chcesz usunąć("colExclude")
. Następnie przekażArray[Column]
goselect
i rozpakuj.val columnsToKeep: Array[Column] = oldDataFrame.columns.diff(Array("colExclude")) .map(x => oldDataFrame.col(x)) val newDataFrame: DataFrame = oldDataFrame.select(columnsToKeep: _*)
źródło
Rozważ 2 ramki dataFrames:
>>> aDF.show() +---+----+ | id|datA| +---+----+ | 1| a1| | 2| a2| | 3| a3| +---+----+
i
>>> bDF.show() +---+----+ | id|datB| +---+----+ | 2| b2| | 3| b3| | 4| b4| +---+----+
Aby osiągnąć to, czego szukasz, istnieją 2 sposoby:
1. Różne warunki łączenia. Zamiast mówić aDF.id == bDF.id
aDF.join(bDF, aDF.id == bDF.id, "outer")
Napisz to:
aDF.join(bDF, "id", "outer").show() +---+----+----+ | id|datA|datB| +---+----+----+ | 1| a1|null| | 3| a3| b3| | 2| a2| b2| | 4|null| b4| +---+----+----+
To automatycznie pozbędzie się dodatkowego procesu upuszczania.
2. Użyj aliasingu: w tym przypadku utracisz dane związane z określonymi identyfikatorami B.
>>> 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| +----+----+----+
źródło
Możesz usunąć kolumnę w ten sposób:
df.drop("column Name).columns
W Twoim przypadku :
df.drop("id").columns
Jeśli chcesz upuścić więcej niż jedną kolumnę, możesz zrobić:
dfWithLongColName.drop("ORIGIN_COUNTRY_NAME", "DEST_COUNTRY_NAME")
źródło