You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Spark Scala DataFrame API实现含多Like/Not Like的CASE WHEN逻辑?

Spark Scala DataFrame API 实现多条件CASE WHEN逻辑

原SQL逻辑拆解

先明确要实现的SQL逻辑:

CASE
WHEN col_1 like '%XYZ' OR col_1 like '%ZYX' THEN
CASE WHEN col_2 like '%TTT' THEN 'ABC' ELSE 'BBA' END
WHEN col_1 not like '%XYZ' OR col_1 not like '%ZYX'
CASE WHEN col_2 like '%YYY' THEN 'BBC' END
END as new_col

DataFrame API实现代码

在Spark Scala中,可通过嵌套when函数实现多层CASE WHEN逻辑,用like/notLike方法对应SQL里的LIKE/NOT LIKE语法:

首先导入必要函数:

import org.apache.spark.sql.functions.{when, col}

然后生成目标列new_col:

val dfWithNewCol = df.withColumn("new_col",
  // 第一个分支:col_1匹配%XYZ或%ZYX
  when(
    col("col_1").like("%XYZ") || col("col_1").like("%ZYX"),
    // 嵌套判断col_2的子条件
    when(col("col_2").like("%TTT"), "ABC").otherwise("BBA")
  )
  // 第二个分支:col_1不匹配%XYZ或不匹配%ZYX
  .when(
    col("col_1").notLike("%XYZ") || col("col_1").notLike("%ZYX"),
    when(col("col_2").like("%YYY"), "BBC")
  )
)

关键说明

  • like完全兼容SQL的通配符规则:%匹配任意长度字符,_匹配单个字符;notLike对应SQL的NOT LIKE,也可写成!col("col_1").like("%XYZ")
  • 嵌套when可实现多层条件判断,和SQL的嵌套CASE语法完全对应
  • 第二个分支的条件col_1 not like '%XYZ' OR col_1 not like '%ZYX'实际等价于永真(除非字符串同时以XYZ和ZYX结尾,这种场景极少),若要简化逻辑,可将第二个when替换为otherwise,效果一致:
val dfWithNewCol = df.withColumn("new_col",
  when(
    col("col_1").like("%XYZ") || col("col_1").like("%ZYX"),
    when(col("col_2").like("%TTT"), "ABC").otherwise("BBA")
  )
  .otherwise(when(col("col_2").like("%YYY"), "BBC"))
)

内容的提问来源于stack exchange,提问作者Appden65

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 22:50:45