withcolumnrenamed spark sheet query create cheat python apache-spark dataframe pyspark apache-spark-sql

python - sheet - spark sql pyspark



Añadir una columna vacía a Spark DataFrame (2)

Todo lo que necesitas aquí es un literal y elenco:

from pyspark.sql.functions import lit new_df = old_df.withColumn(''new_column'', lit(None).cast(StringType()))

Un ejemplo completo:

df = sc.parallelize([row(1, "2"), row(2, "3")]).toDF() df.printSchema() ## root ## |-- foo: long (nullable = true) ## |-- bar: string (nullable = true) new_df = df.withColumn(''new_column'', lit(None).cast(StringType())) new_df.printSchema() ## root ## |-- foo: long (nullable = true) ## |-- bar: string (nullable = true) ## |-- new_column: string (nullable = true) new_df.show() ## +---+---+----------+ ## |foo|bar|new_column| ## +---+---+----------+ ## | 1| 2| null| ## | 2| 3| null| ## +---+---+----------+

Un equivalente de Scala se puede encontrar aquí: Crear un nuevo marco de datos con valores de campo vacíos / nulos

Como se mencionó en many otras ubicaciones en la web, agregar una nueva columna a un DataFrame existente no es sencillo. Desafortunadamente, es importante tener esta funcionalidad (aunque sea ineficiente en un entorno distribuido), especialmente cuando se intenta concatenar dos DataFrame usando unionAll .

¿Cuál es la solución más elegante para agregar una columna null a un DataFrame para facilitar un unionAll ?

Mi versión es así:

from pyspark.sql.types import StringType from pyspark.sql.functions import UserDefinedFunction to_none = UserDefinedFunction(lambda x: None, StringType()) new_df = old_df.withColumn(''new_column'', to_none(df_old[''any_col_from_old'']))


Yo emitiría encendido (Ninguno) a NullType en lugar de StringType. De modo que si alguna vez tenemos que filtrar no filas nulas en esa columna ... se puede hacer fácilmente de la siguiente manera

df = sc.parallelize([Row(1, "2"), Row(2, "3")]).toDF() new_df = df.withColumn(''new_column'', lit(None).cast(NullType())) new_df.printSchema() df_null = new_df.filter(col("new_column").isNull()).show() df_non_null = new_df.filter(col("new_column").isNotNull()).show()

También tenga cuidado de no usar lit ("None") (con comillas) si está realizando la conversión a StringType, ya que fallaría en la búsqueda de registros con condición de filtro .isNull () en col ("new_column").