gpt4 book ai didi

sql - Spark Dataframe 嵌套 Case When 语句

转载 作者:行者123 更新时间:2023-12-02 22:24:50 26 4
gpt4 key购买 nike

我需要在 Spark DataFrame 中实现以下 SQL 逻辑

SELECT KEY,
CASE WHEN tc in ('a','b') THEN 'Y'
WHEN tc in ('a') AND amt > 0 THEN 'N'
ELSE NULL END REASON,
FROM dataset1;

我的输入DataFrame如下:

val dataset1 = Seq((66, "a", "4"), (67, "a", "0"), (70, "b", "4"), (71, "d", "4")).toDF("KEY", "tc", "amt")

dataset1.show()
+---+---+---+
|KEY| tc|amt|
+---+---+---+
| 66| a| 4|
| 67| a| 0|
| 70| b| 4|
| 71| d| 4|
+---+---+---+

我已将嵌套 case when 语句实现为:

dataset1.withColumn("REASON", when(col("tc").isin("a", "b"), "Y")
.otherwise(when(col("tc").equalTo("a") && col("amt").geq(0), "N")
.otherwise(null))).show()
+---+---+---+------+
|KEY| tc|amt|REASON|
+---+---+---+------+
| 66| a| 4| Y|
| 67| a| 0| Y|
| 70| b| 4| Y|
| 71| d| 4| null|
+---+---+---+------+

如果嵌套的when语句更进一步,那么带有“otherwise”语句的上述逻辑的可读性会有点困惑。

是否有更好的方法在 Spark DataFrames 中实现嵌套 case when 语句?

最佳答案

这里没有嵌套,因此不需要otherwise。您所需要的只是链接when:

import spark.implicits._

when($"tc" isin ("a", "b"), "Y")
.when($"tc" === "a" && $"amt" >= 0, "N")

ELSE NULL 是隐式的,因此您可以完全省略它。

您使用的模式更适用于数据结构上的折叠:

val cases = Seq(
($"tc" isin ("a", "b"), "Y"),
($"tc" === "a" && $"amt" >= 0, "N")
)

其中when - otherwise自然遵循递归模式,并且null提供基本情况。

cases.foldLeft(lit(null)) {
case (acc, (expr, value)) => when(expr, value).otherwise(acc)
}

请注意,在这一系列条件下不可能达到“N”结果。如果tc等于“a”,它将被第一个子句捕获。如果不是,它将无法满足两个谓词并默认为NULL。你应该:

when($"tc" === "a" && $"amt" >= 0, "N")
.when($"tc" isin ("a", "b"), "Y")

关于sql - Spark Dataframe 嵌套 Case When 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46640862/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com