>>> 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: biginty 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#34despué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 todoscolumnspara eldataframe,dfcondf.columnsdrop_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
idcolumna 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)selectacepta 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.columnsya es unalistde cadenas.idcolumna. En ese caso, debe usar lasColumninstancias 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
Arrayde columna de suoldDataFramey elimine las columnas que desea eliminar("colExclude"). A continuación, pasar laArray[Column]aselecty 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).columnsEn tu caso :
df.drop("id").columnsSi desea eliminar más de una columna, puede hacer lo siguiente:
dfWithLongColName.drop("ORIGIN_COUNTRY_NAME", "DEST_COUNTRY_NAME")fuente