Apache spark处理case语句

时间:2016-10-11 16:27:42

标签: apache-spark pyspark spark-dataframe rdd pyspark-sql

我正在处理将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'

2 个答案:

答案 0 :(得分:24)

我不擅长python。但是会尝试给出我在scala中所做的一些指示。

  

问题:TYPE = 'WE' and CH = 'true'然后进行一些逻辑检查。这是正确的做法吗?

它的一种方法。

withColumn is another approach

DataFrame.withColumn method in pySpark supports adding a new column or replacing existing columns of the same name.

在这种情况下,你必须处理rdd.map    via - spark udf或者语法

for example :

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

答案 1 :(得分:0)

这是在If-Else中写When-Then-Else / When-Otherwise / pyspark表达式的几种方法。

示例数据框

df = spark.createDataFrame([(1,1),(2,2),(3,3)],['id','value'])

df.show()

#+---+-----+
#| id|value|
#+---+-----+
#|  1|    1|
#|  2|    2|
#|  3|    3|
#+---+-----+

选项#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的表达式也可以使用pyspark.sql.functions.expr函数用withColumn()select()编写。这是示例。

选项4: 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()

选项5: 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|
#+---+-----+----------+