Апачская искра, имеющая дело с утверждениями дела
Я имею дело с преобразованием кода 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|
#+---+-----+----------+