当前位置: 首页 > 面试题库 >

Spark Dataframe嵌套的when语句

万俟嘉珍
2023-03-14
问题内容

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

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|
+---+---+---+

我已经实现了嵌套的情况,当声明为:

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


问题答案:

这里没有嵌套,因此不需要otherwise。您所需的全部都是链式的when

import spark.implicits._

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

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

您使用的模式更适用于folding数据结构

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")


 类似资料:
  • 问题内容: 以下是我当前的SELECT CASE语句: 我并不总是想重复版本=’xxx’的条件,例如 在Excel中,这相当容易,但是如何在PostgreSQL中进行编译呢? 问题答案: 试试这个

  • Go 语言条件语句 你可以在 if 或 else if 语句中嵌入一个或多个 if 或 else if 语句。 语法 Go 编程语言中 if...else 语句的语法如下: if 布尔表达式 1 { /* 在布尔表达式 1 为 true 时执行 */ if 布尔表达式 2 { /* 在布尔表达式 2 为 true 时执行 */ } } 你可以以同样的方式在 if

  • 前面章节中,详细介绍了 3 种形式的条件语句,即 if、if else 和 if elif else,这 3 种条件语句之间可以相互嵌套。 例如,在最简单的 if 语句中嵌套 if else 语句,形式如下: if 表达式 1:     if 表示式 2:         代码块 1     else:         代码块 2 再比如,在 if else 语句中嵌套 if else 语句,形式

  • Swift 条件语句 在 Swift 语言中,你可以在一个 if 或 else if 语句内使用另一个 if 或 else if 语句。 语法 Swift 语言中 嵌套 if 语句的语法: if boolean_expression_1 { /* 当 boolean_expression_1 表达式 true 时执行 */ if boolean_expression_2 {

  • C++ 判断 您可以把一个 switch 作为一个外部 switch 的语句序列的一部分,即可以在一个 switch 语句内使用另一个 switch 语句。即使内部和外部 switch 的 case 常量包含共同的值,也没有矛盾。 C++ 中的 switch 语句允许至少 256 个嵌套层次。 语法 C++ 中 嵌套 switch 语句的语法: switch(ch1) { case 'A'

  • C++ 判断 在 C++ 中,嵌套 if-else 语句是合法的,这意味着您可以在一个 if 或 else if 语句内使用另一个 if 或 else if 语句。 语法 C++ 中 嵌套 if 语句的语法: if( boolean_expression 1) { // 当布尔表达式 1 为真时执行 if(boolean_expression 2) { // 当布尔