>>> 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]
Hay dos id: bigint
y quiero eliminar uno. ¿Como lo puedo hacer?
apache-spark
apache-spark-sql
pyspark
xjx0524
fuente
fuente
ndf = df.drop('age')
Agregando a la respuesta de @ Patrick, puede usar lo siguiente para eliminar varias columnas
columns_to_drop = ['id', 'id_copy'] df = df.drop(*columns_to_drop)
fuente
TreeNodeException: Binding attribute, tree: _gen_alias_34#34
después de colocar una columna y usar.show()
Una manera fácil de hacer esto es el usuario "
select
" y darse cuenta de que puede obtener una lista de todoscolumns
para eldataframe
,df
condf.columns
drop_list = ['a column', 'another column', ...] df.select([column for column in df.columns if column not in drop_list])
fuente
df.select([df.columns[column_num] for column_num in range(len(df.columns)) if column_num!=2])
, donde la columna que quiero eliminar tiene el índice 2.Puede nombrar explícitamente las columnas que desea mantener, así:
O en un enfoque más general, incluiría todas las columnas excepto una específica a través de una lista de comprensión. Por ejemplo, así (excluyendo la
id
columna deb
):keep = [a[c] for c in a.columns] + [b[c] for c in b.columns if c != 'id']
Finalmente, realiza una selección en el resultado de su unión:
d = a.join(b, a.id==b.id, 'outer').select(*keep)
fuente
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
acepta cadenas O columnas ( spark.apache.org/docs/latest/api/python/… ). Por cierto, en su líneakeep = ...
no hay necesidad de usar una lista de comprensión paraa
:a.columns + [c for c in b.columns if c != 'id']
debería lograr exactamente lo mismo, comoa.columns
ya es unalist
de cadenas.id
columna. En ese caso, debe usar lasColumn
instancias enselect
.Puede utilizar de dos formas:
1: Solo mantén las columnas necesarias:
drop_column_list = ["drop_column"] df = df.select([column for column in df.columns if column not in drop_column_list])
2: Esta es la forma más elegante.
df = df.drop("col_name")
Debe evitar la versión collect (), ya que enviará al maestro el conjunto de datos completo, ¡requerirá un gran esfuerzo informático!
fuente
Quizás un poco fuera de tema, pero aquí está la solución usando Scala. Cree un nombre
Array
de columna de suoldDataFrame
y elimine las columnas que desea eliminar("colExclude")
. A continuación, pasar laArray[Column]
aselect
y descomprimirlo.val columnsToKeep: Array[Column] = oldDataFrame.columns.diff(Array("colExclude")) .map(x => oldDataFrame.col(x)) val newDataFrame: DataFrame = oldDataFrame.select(columnsToKeep: _*)
fuente
Considere 2 marcos de datos:
>>> aDF.show() +---+----+ | id|datA| +---+----+ | 1| a1| | 2| a2| | 3| a3| +---+----+
y
>>> bDF.show() +---+----+ | id|datB| +---+----+ | 2| b2| | 3| b3| | 4| b4| +---+----+
Para lograr lo que está buscando, hay 2 formas:
1. Condición de unión diferente. En lugar de decir aDF.id == bDF.id
aDF.join(bDF, aDF.id == bDF.id, "outer")
Escribe esto:
aDF.join(bDF, "id", "outer").show() +---+----+----+ | id|datA|datB| +---+----+----+ | 1| a1|null| | 3| a3| b3| | 2| a2| b2| | 4|null| b4| +---+----+----+
Esto eliminará automáticamente el exceso del proceso de caída.
2. Use Aliasing: perderá datos relacionados con los ID específicos de B en esto.
>>> 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| +----+----+----+
fuente
Puede eliminar una columna como esta:
df.drop("column Name).columns
En tu caso :
df.drop("id").columns
Si desea eliminar más de una columna, puede hacer lo siguiente:
dfWithLongColName.drop("ORIGIN_COUNTRY_NAME", "DEST_COUNTRY_NAME")
fuente