私はSQLコードをPySparkコードに変換しようとしており、いくつかのSQLステートメントに遭遇しました。 pysparkのケース文にどのようにアプローチするのかわかりませんか? RDDを作成してからrdd.mapを使用して、いくつかのロジックチェックを行うことを計画しています。それは正しいアプローチですか?助けてください!
基本的に、RDDまたはDFの各行を調べる必要があり、いくつかのロジックに基づいて、列値の1つを編集する必要があります。
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'
私はPythonが苦手です。しかし、私がscalaで行ったことのいくつかの指針を与えようとします。
質問 :
rdd.map
その後、いくつかのロジックチェックを行います。それは正しいアプローチですか?
その1つのアプローチ。
DataFrame.withColumn
メソッドは、pySparkの新しい列の追加または同じ名前の既存の列の置換をサポートしています。
このコンテキストでは、Column
を介して-spark 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|
+-----+---------------------------------+
when
otherwise
の代わりにudfも使用できます。
これらは、pyspark
で_If-Else
_/_When-Then-Else
_/_When-Otherwise
_式を記述するいくつかの方法です。
サンプルデータフレーム
_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()
when-otherwiseを使用
_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()
when-otherwiseを使用
_from pyspark.sql.functions import when
df.select("*",when(df.value == 1, 'one').when(df.value == 2, 'two').otherwise('other').alias('value_desc')).show()
_
Option3:selectExpr()
同等のSQL CASE式を使用
_df.selectExpr("*","CASE WHEN value == 1 THEN 'one' WHEN value == 2 THEN 'two' ELSE 'other' END AS value_desc").show()
_
SQLのような式は、 pyspark.sql.functions.expr functionを使用してwithColumn()
およびselect()
で記述することもできます。以下に例を示します。
Option4:select()
using expr function
_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()
using expr function
_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|
#+---+-----+----------+
_