Vengo de antecedentes de pandas y estoy acostumbrado a leer datos de archivos CSV en un marco de datos y luego simplemente cambiar los nombres de columna a algo útil usando el comando simple:
df.columns = new_column_name_list
Sin embargo, lo mismo no funciona en los marcos de datos pyspark creados con sqlContext. La única solución que podría resolver para hacer esto fácilmente es la siguiente:
df = sqlContext.read.format("com.databricks.spark.csv").options(header='false', inferschema='true', delimiter='\t').load("data.txt")
oldSchema = df.schema
for i,k in enumerate(oldSchema.fields):
k.name = new_column_name_list[i]
df = sqlContext.read.format("com.databricks.spark.csv").options(header='false', delimiter='\t').load("data.txt", schema=oldSchema)
Básicamente, esto es definir la variable dos veces e inferir el esquema primero, luego renombrar los nombres de columna y luego cargar el marco de datos nuevamente con el esquema actualizado.
¿Hay una manera mejor y más eficiente de hacer esto como lo hacemos en los pandas?
Mi versión de chispa es 1.5.0
fuente
for
loop +withColumnRenamed
, pero tureduce
opción es muy buena :)from functools import reduce
Ventaja de usar de esta manera: con una larga lista de columnas, le gustaría cambiar solo unos pocos nombres de columna. Esto puede ser muy conveniente en estos escenarios. Muy útil al unir tablas con nombres de columna duplicados.
fuente
Si desea cambiar todos los nombres de columnas, intente
df.toDF(*cols)
fuente
df = df.toDF(*my_pandas_df.columns)
cols
los nuevos nombres de columna, y simplemente asumiendo que el orden de los nombrescols
corresponde al orden de las columnas del marco de datos?En caso de que desee aplicar una transformación simple en todos los nombres de columna, este código funciona: (Estoy reemplazando todos los espacios con guiones bajos)
Gracias a @ user8117731 por el
toDf
truco.fuente
Si desea cambiar el nombre de una sola columna y mantener el resto como está:
fuente
df.withColumnRenamed('age', 'age2')
fuente
withColumnRenamed
.Este es el enfoque que utilicé:
crear sesión de pyspark:
crear marco de datos:
ver df con nombres de columna:
crear una lista con nuevos nombres de columna:
cambiar los nombres de columna de la df:
ver df con nuevos nombres de columna:
fuente
Hice una función fácil de usar para cambiar el nombre de varias columnas para un marco de datos pyspark, en caso de que alguien quiera usarlo:
fuente
old_columns
sería lo mismo quedf.columns
.Otra forma de renombrar solo una columna (usando
import pyspark.sql.functions as F
):fuente
Yo uso este:
fuente
Puede usar la siguiente función para cambiar el nombre de todas las columnas de su marco de datos.
En caso de que necesite actualizar solo los nombres de algunas columnas, puede usar el mismo nombre de columna en la lista replace_with
Para renombrar todas las columnas
Para renombrar algunas columnas
fuente
Para cambiar el nombre de una sola columna, aún puede usar toDF (). Por ejemplo,
fuente
Podemos usar varios enfoques para cambiar el nombre de la columna.
Primero, dejemos crear un DataFrame simple.
Ahora intentemos renombrar col_1 a col_3. PFB algunos enfoques para hacer lo mismo.
Aquí está la salida.
Espero que esto ayude.
fuente