web-dev-qa-db-fra.com

Apache spark traitant des déclarations de cas

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'
12
Kunal Anand

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

DataFrame.withColumn la méthode dans pySpark prend en charge l'ajout d'une nouvelle colonne ou le remplacement de colonnes existantes du même nom.

Dans ce contexte, vous devez gérer Column via - spark udf ou dans le cas contraire la syntaxe

par exemple:

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 whenotherwise.

25
Ram Ghadiyaram

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|
#+---+-----+----------+
11
Shan