Апачская искра, имеющая дело с утверждениями дела

Я имею дело с преобразованием кода SQL в код PySpark и натолкнулся на некоторые операторы SQL. Я не знаю, как подойти к случаям дела в pyspark? Я планирую создать RDD, а затем использовать rdd.map, а затем выполнить некоторые логические проверки. Это правильный подход? Пожалуйста, помогите!

В основном мне нужно пройти через каждую строку в RDD или DF и на основе некоторой логики мне нужно отредактировать одно из значений столбца.

     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'

Ответ 1

Я не очень хорош в питоне. Но постараюсь дать некоторые указания на то, что я сделал в scala.

Вопрос: rdd.map, а затем выполните некоторые логические проверки. Это правильный подход?

Его один подход.

withColumn - это еще один подход

DataFrame.withColumn метод в pySpark поддерживает добавление нового столбца или замену существующих столбцов с тем же именем

В этом контексте вам нужно иметь дело с Column через - искру udf или в противном случае синтаксис

например:

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|
+-----+---------------------------------+

вы можете использовать udf вместо when otherwise.

Ответ 2

Эти несколько способов записи If-Else/When-Then-Else/When-Otherwise в pyspark When-Otherwise выражение в pyspark.

Примерный фрейм данных

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

Вариант № 1: withColumn() используя когда-либо

from pyspark.sql.functions import when

df.withColumn("value_desc",when(df.value == 1, 'one').when(df.value == 2, 'two').otherwise('other')).show()

Вариант № 2: select() используя когда-либо

from pyspark.sql.functions import when

df.select("*",when(df.value == 1, 'one').when(df.value == 2, 'two').otherwise('other').alias('value_desc')).show()

Вариант 3: selectExpr() с использованием SQL-эквивалента выражения CASE

df.selectExpr("*","CASE WHEN value == 1 THEN  'one' WHEN value == 2 THEN  'two' ELSE 'other' END AS value_desc").show()

SQL-подобное выражение также может быть записано в withColumn() и select() с помощью функции pyspark.sql.functions.expr. Вот примеры.

Option4: select() используя функцию 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()

Option5: withColumn() используя функцию 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()

Выход:

#+---+-----+----------+
#| id|value|value_desc|
#+---+-----+----------+
#|  1|    1|       one|
#|  2|    2|       two|
#|  3|    3|     other|
#+---+-----+----------+