Comme mentionné dans nombreuxautres emplacements sur le Web, ajouter une nouvelle colonne à un DataFrame existant n'est pas simple. Malheureusement, il est important d'avoir cette fonctionnalité (même si elle est inefficace dans un environnement distribué), en particulier lorsque vous essayez de concaténer deux DataFrame
en utilisant unionAll
.
Quelle est la solution de contournement la plus élégante pour ajouter une colonne null
à une DataFrame
pour faciliter une unionAll
?
Ma version va comme ceci:
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']))
Tout ce dont vous avez besoin ici est un littéral et un casting:
from pyspark.sql.functions import lit
new_df = old_df.withColumn('new_column', lit(None).cast(StringType()))
Un exemple complet:
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|
## +---+---+----------+
A Scala équivalent peut être trouvé ici: Créer un nouveau Dataframe avec des valeurs de champ vide/nul