如何用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
相关产品推荐
相关产品推荐

