【问题标题】:SPARK SQL: Implement AND condition inside a CASE statementSPARK SQL:在 CASE 语句中实现 AND 条件
【发布时间】:2016-11-10 21:01:01
【问题描述】:

我知道如何使用 Scala 在 SPARK SQL 中实现一个简单的 CASE-WHEN-THEN 子句。我使用的是 1.6.2 版。但是,我需要在 CASE-WHEN 子句中的多个列上指定 AND 条件。如何在 SPARK 中使用 Scala 实现这一点?

提前感谢您的时间和帮助!

这是我的 SQL 查询:

select  sd.standardizationId,
   case when sd.numberOfShares = 0 and
             isnull(sd.derivatives,0) = 0 and 
             sd.holdingTypeId not in (3,10)
        then 
             8
        else
             holdingTypeId
       end 
   as holdingTypeId 
from sd;

【问题讨论】:

标签: scala apache-spark apache-spark-sql


【解决方案1】:

首先将表读取为数据框

val table = sqlContext.table("sd")

然后用表达式选择。根据您的数据库对齐语法。

val result = table.selectExpr("standardizationId","case when numberOfShares = 0 and isnull(derivatives,0) = 0 and holdingTypeId not in (3,10) then 8 else holdingTypeId end as holdingTypeId")

并显示结果

result.show

【讨论】:

  • 只是想知道,如果这有效,问题中的上述查询也有效......对吗?这两者有什么区别?
  • 在第一个示例中,它用作查询表和创建数据框的 sql(如果作者以相同的方式使用),它应该在“不在”处引发解析异常。在第二个示例中,选择应用于已经从表中创建的数据帧,并且那里的操作只是根据语法支持引发解析异常。
【解决方案2】:

如果要避免使用完整的字符串表达式,另一种选择如下:

import org.apache.spark.sql.Column
import org.apache.spark.sql.functions._

val sd = sqlContext.table("sd")

val conditionedColumn: Column = when(
  (sd("numberOfShares") === 0) and
  (coalesce(sd("derivatives"), lit(0)) === 0) and
  (!sd("holdingTypeId").isin(Seq(3,10): _*)), 8
).otherwise(sd("holdingTypeId")).as("holdingTypeId")

val result = sd.select(sd("standardizationId"), conditionedColumn)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    • 2021-04-02
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    相关资源
    最近更新 更多