web-dev-qa-db-fra.com

Comment remplacer une valeur de chaîne par NULL dans PySpark?

Je veux faire quelque chose comme ça:

df.replace('empty-value', None, 'NAME')

En gros, je veux remplacer une valeur par NULL. mais il n'accepte pas Aucun dans cette fonction. Comment puis-je faire ceci?

8
talloaktrees

Ceci remplacera empty-value par None dans votre colonne name:

from pyspark.sql.functions import udf
from pyspark.sql.types import StringType


df = sc.parallelize([(1, "empty-value"), (2, "something else")]).toDF(["key", "name"])
new_column_udf = udf(lambda name: None if name == "empty-value" else name, StringType())
new_df = df.withColumn("name", new_column_udf(df.name))
new_df.collect()

Sortie:

[Row(key=1, name=None), Row(key=2, name=u'something else')]

En utilisant l'ancien nom comme premier paramètre dans withColumn, il remplace en réalité l'ancienne colonne name par la nouvelle générée par la sortie UDF.

4
Daniel Zolnai

Vous pouvez combiner la clause when avec le littéral et les types NULL comme suit:

from pyspark.sql.functions import when, lit, col

df = sc.parallelize([(1, "foo"), (2, "bar")]).toDF(["x", "y"])

def replace(column, value):
    return when(column != value, column).otherwise(lit(None))

df.withColumn("y", replace(col("y"), "bar")).show()
## +---+----+
## |  x|   y|
## +---+----+
## |  1| foo|
## |  2|null|
## +---+----+

Il n'introduit pas BatchPythonEvaluation et, à cause de cela, devrait être nettement plus efficace que d'utiliser un fichier UDF.

22
zero323

La meilleure alternative consiste à utiliser une variable when combinée à une variable NULL. Exemple: 

from pyspark.sql.functions import when, lit, col

df= df.withColumn('foo', when(col('foo') != 'empty-value',col('foo)))

Si vous souhaitez remplacer plusieurs valeurs par la valeur null, vous pouvez utiliser | dans la condition when ou la fonction puissante create_map .

Il est important de noter que la pire solution pour la résoudre avec l’utilisation de UDF. En effet, les udfs offrent une grande polyvalence à votre code, mais viennent avec un pénalité énorme sur les performances.

0
Chp11