PYSPARK:如何将带有多个 case 语句的 SQL 查询转换为 Pyspark/Pyspark-SQL?

Posted

技术标签:

【中文标题】PYSPARK:如何将带有多个 case 语句的 SQL 查询转换为 Pyspark/Pyspark-SQL?【英文标题】:PYSPARK : How to covert SQL query with multiple case statements to Pyspark/Pyspark-SQL? 【发布时间】:2022-01-19 08:14:04 【问题描述】:

我有两组带有多个 case 语句的查询。我需要在 pyspark 中实现相同的逻辑。我试过了,但我在多个时间遇到了一些困难。任何帮助都将不胜感激。

第一个查询

case
when appointment_date is null
then 0
when resolution_desc in (
'CSTXCL - OK BY PHONE'
)
or resolution_des ilike '%NO VAN ROLL%'
then 0
when status in ('PENDING','CANCELLED')
then 0
when ticket_type = 'install'
and appointment_required is true
end as truck_roll

第二个查询

case when status = 'COMPLETED'  and resolution not in ('CANCELLING ORDER','CANCEL ORDER')
then 1 else 0 end as completed, 
case when status = 'CANCELLED'  or ( status in ('COMPLETED','PENDING' ) and resolution_desc in ('CANCELLING ORDER','CANCEL ORDER') ) then 1 else 0 end as cancelled.

我尝试了以下代码进行第二次查询,但不起作用:

sparkdf.withColumn('completed', f.when((sparkdf.ticket_status =='COMPLETED') & (~sparkdf.resolution_description.isin('CANCELLING ORDER','CANCEL ORDER','CLOSE SRO')),1).otherwise(0))\
.withColumn('cancelled', f.when((sparkdf.ticket_status == 'CANCELLED') | (sparkdf.ticket_status.isin('COMPLETED','PENDING')) & (sparkdf.resolution_description.isin('CANCELLING ORDER','CANCEL ORDER','CLOSE SRO')),1).otherwise(0))

【问题讨论】:

您可以更轻松地将数据框注册为 sql 视图,并针对该视图运行相同的、稍加调整的 sql 代码。注册使用:df.createOrReplaceTempView('df_view'),使用sql使用:df = spark.sql('''your_sql_query from df_view''') 【参考方案1】:

您可以使用“expr”函数来执行SQL代码(在这种情况下使用三引号,因为它是多行的):

from pyspark.sql.functions import expr

sparkdf.withColumn(
    'completed',
    expr('''
           CASE WHEN status = 'COMPLETED' 
                  AND resolution NOT IN ('CANCELLING ORDER',
                                         'CANCEL ORDER') THEN 1 
                ELSE                                          0 
           END
         '''
        )
)

当然,你也可以对“取消”的栏目做同样的事情

【讨论】:

以上是关于PYSPARK:如何将带有多个 case 语句的 SQL 查询转换为 Pyspark/Pyspark-SQL?的主要内容,如果未能解决你的问题,请参考以下文章

带有多个语句的单行 VBScript 选择案例:例如:案例 0:x=a y=b

带有 CASE 条件和 SUM() 的 SELECT 查询

如何在pyspark数据框中添加多个带有when条件的新列?

C# 将带有 Case 语句的 SQL 查询转换为 LINQ

带有表连接、case 语句、计数、group by 子句的 Linq 查询

SQL CASE THEN 语句,其中 ID 具有多个值