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").