Je traite de la transformation du code SQL en code PySpark et suis tombé sur quelques instructions SQL. Je ne sais pas comment aborder les relevés de cas dans pyspark? Je prévois de créer un RDD puis d'utiliser rdd.map, puis de faire des vérifications logiques. Est-ce la bonne approche? Aidez-moi!
Fondamentalement, je dois parcourir chaque ligne du RDD ou DF et en fonction d'une logique, j'ai besoin de modifier l'une des valeurs de colonne.
case
when (e."a" Like 'a%' Or e."b" Like 'b%')
And e."aa"='BW' And cast(e."abc" as decimal(10,4))=75.0 Then 'callitA'
when (e."a" Like 'b%' Or e."b" Like 'a%')
And e."aa"='AW' And cast(e."abc" as decimal(10,4))=75.0 Then 'callitB'
else
'CallitC'
Je ne suis pas bon en python. Mais j'essaierai de donner quelques indications sur ce que j'ai fait en scala.
Question:
rdd.map
puis effectuez quelques vérifications logiques. Est-ce la bonne approche?
C'est une approche.
withColumn
est une autre approche
Dans ce contexte, vous devez gérer Column
via - spark udf ou dans le cas contraire la syntaxe
from pyspark.sql import functions as F
df.select(df.name, F.when(df.age > 4, 1).when(df.age < 3, -1).otherwise(0)).show()
+-----+--------------------------------------------------------+
| name|CASE WHEN (age > 4) THEN 1 WHEN (age < 3) THEN -1 ELSE 0|
+-----+--------------------------------------------------------+
|Alice| -1|
| Bob| 1|
+-----+--------------------------------------------------------+
from pyspark.sql import functions as F
df.select(df.name, F.when(df.age > 3, 1).otherwise(0)).show()
+-----+---------------------------------+
| name|CASE WHEN (age > 3) THEN 1 ELSE 0|
+-----+---------------------------------+
|Alice| 0|
| Bob| 1|
+-----+---------------------------------+
vous pouvez également utiliser udf au lieu de when
otherwise
.
Ce sont quelques façons d'écrire l'expression If-Else
/When-Then-Else
/When-Otherwise
Dans pyspark
.
Exemple de trame de données
df = spark.createDataFrame([(1,1),(2,2),(3,3)],['id','value'])
df.show()
#+---+-----+
#| id|value|
#+---+-----+
#| 1| 1|
#| 2| 2|
#| 3| 3|
#+---+-----+
#Desired Output:
#+---+-----+----------+
#| id|value|value_desc|
#+---+-----+----------+
#| 1| 1| one|
#| 2| 2| two|
#| 3| 3| other|
#+---+-----+----------+
Option # 1 : withColumn()
utilisant quand-sinon
from pyspark.sql.functions import when
df.withColumn("value_desc",when(df.value == 1, 'one').when(df.value == 2, 'two').otherwise('other')).show()
Option # 2 : select()
en utilisant quand-sinon
from pyspark.sql.functions import when
df.select("*",when(df.value == 1, 'one').when(df.value == 2, 'two').otherwise('other').alias('value_desc')).show()
Option 3: selectExpr()
en utilisant une expression CASE équivalente SQL
df.selectExpr("*","CASE WHEN value == 1 THEN 'one' WHEN value == 2 THEN 'two' ELSE 'other' END AS value_desc").show()
Une expression de type SQL peut également être écrite dans la fonction withColumn()
et select()
à l'aide de la fonction pyspark.sql.functions.expr . Voici des exemples.
Option 4: select()
en utilisant la fonction expr
from pyspark.sql.functions import expr
df.select("*",expr("CASE WHEN value == 1 THEN 'one' WHEN value == 2 THEN 'two' ELSE 'other' END AS value_desc")).show()
Option 5: withColumn()
en utilisant la fonction expr
from pyspark.sql.functions import expr
df.withColumn("value_desc",expr("CASE WHEN value == 1 THEN 'one' WHEN value == 2 THEN 'two' ELSE 'other' END AS value_desc")).show()
Sortie:
#+---+-----+----------+
#| id|value|value_desc|
#+---+-----+----------+
#| 1| 1| one|
#| 2| 2| two|
#| 3| 3| other|
#+---+-----+----------+