web-dev-qa-db-fra.com

PySpark: plusieurs conditions dans la clause when

J'aimerais modifier les valeurs de cellule d'une colonne de structure de données (Age) où elle est actuellement vide et que je ne le ferais que si une autre colonne (survivant) a la valeur 0 pour la ligne correspondante où elle est vide pour l'âge. S'il est 1 dans la colonne Survived mais vide dans la colonne Age, je le garderai comme nul.

J'ai essayé d'utiliser && _ opérateur mais cela n'a pas fonctionné. Voici mon code:

tdata.withColumn("Age",  when((tdata.Age == "" && tdata.Survived == "0"), mean_age_0).otherwise(tdata.Age)).show()

Des suggestions comment gérer cela? Merci.

Message d'erreur:

SyntaxError: invalid syntax
  File "<ipython-input-33-3e691784411c>", line 1
    tdata.withColumn("Age",  when((tdata.Age == "" && tdata.Survived == "0"), mean_age_0).otherwise(tdata.Age)).show()
                                                    ^
28
sjishan

Vous obtenez une exception d'erreur SyntaxError parce que Python n'a pas de && _ opérateur. Il a and et & où ce dernier est le bon choix pour créer des expressions booléennes sur Column (| pour une disjonction logique et ~ pour la négation logique).

La condition que vous avez créée est également invalide car elle ne prend pas en compte priorité de l'opérateur . & in Python a une priorité plus élevée que == donc l'expression doit être mise entre parenthèses.

(col("Age") == "") & (col("Survived") == "0")
## Column<b'((Age = ) AND (Survived = 0))'>

Sur une note, la fonction when équivaut à la phrase case et non à la clause WHEN. Toujours les mêmes règles s'appliquent. Conjonction:

df.where((col("foo") > 0) & (col("bar") < 0))

Disjonction:

df.where((col("foo") > 0) | (col("bar") < 0))

Vous pouvez bien sûr définir les conditions séparément pour éviter les parenthèses:

cond1 = col("Age") == "" 
cond2 = col("Survived") == "0"

cond1 & cond2
75
zero323

cela devrait fonctionner au moins dans pyspark 2.4

tdata = tdata.withColumn("Age",  when((tdata.Age == "") & (tdata.Survived == "0") , "NewValue").otherwise(tdata.Age))
1

quand dans pyspark plusieurs conditions peuvent être construites avec & (pour et) et | (pour ou).

Remarque: Dans pyspark Il est important de placer toutes les expressions entre parenthèses () qui se combinent pour former la condition.

%pyspark
dataDF = spark.createDataFrame([(66, "a", "4"), 
                                (67, "a", "0"), 
                                (70, "b", "4"), 
                                (71, "d", "4")],
                                ("id", "code", "amt"))
dataDF.withColumn("new_column",
       when((col("code") == "a") | (col("code") == "d"), "A")
      .when((col("code") == "b") & (col("amt") == "4"), "B")
      .otherwise("A1")).show()

Dans les conditions Spark Scala ( &&) ou ||) être utilisé dans quand fonction

//scala
val dataDF = Seq(
      (66, "a", "4"), (67, "a", "0"), (70, "b", "4"), (71, "d", "4"
      )).toDF("id", "code", "amt")
dataDF.withColumn("new_column",
       when(col("code") === "a" || col("code") === "d", "A")
      .when(col("code") === "b" && col("amt") === "4", "B")
      .otherwise("A1")).show()

========================

Output:
+---+----+---+----------+
| id|code|amt|new_column|
+---+----+---+----------+
| 66|   a|  4|         A|
| 67|   a|  0|         A|
| 70|   b|  4|         B|
| 71|   d|  4|         A|
+---+----+---+----------+

Cet extrait de code est copié à partir de sparkbyexamples.com

0
vj sreenivasan