web-dev-qa-db-ja.com

Apache spark caseステートメントの処理

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

私はPythonが苦手です。しかし、私がscalaで行ったことのいくつかの指針を与えようとします。

質問 : rdd.mapその後、いくつかのロジックチェックを行います。それは正しいアプローチですか?

その1つのアプローチ。

withColumnは別のアプローチです

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

whenotherwiseの代わりにudfも使用できます。

25
Ram Ghadiyaram

これらは、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#1withColumn() 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#2select() 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|
#+---+-----+----------+
_
11
Shan