web-dev-qa-db-fra.com

Ajoutez une colonne vide à Spark DataFrame

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']))
25
architectonic

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

55
zero323