Apache spark Spark Othery()始终处于求值状态
假设我有以下代码:Apache spark Spark Othery()始终处于求值状态,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,假设我有以下代码: val option: Option[String] = ??? // May be some or none val validation: Boolean = ??? // May be true or false val df = ??? // load data 现在我想添加两个新列: 第一个是基于布尔值的列 第二个是基于whenother子句。上一次 列是真的,我只需要输入一个lit(3)值。当它是假的时候,我打电话给你 一个函数,当选项值发生异常时应引发异常
val option: Option[String] = ??? // May be some or none
val validation: Boolean = ??? // May be true or false
val df = ??? // load data
现在我想添加两个新列:
- 第一个是基于布尔值的列
- 第二个是基于whenother子句。上一次
列是真的,我只需要输入一个
值。当它是假的时候,我打电话给你 一个函数,当选项值发生异常时应引发异常 不存在:lit(3)
def dealWithOtherwise(maybeString: Option[String]): Column = { maybeString match { case Some(default) => lit(default) case None => throw new Exception() } } df .withColumn("validationIsOk", validation) .withColumn("field", when(col("validationIsOk"), lit(3)).otherwise(dealWithOtherwise(option)) )
option=None
和validation=false
时抛出异常。然而,当验证为true且默认选项为None时,我将引发异常。这就像否则,无论when子句中的条件如何,函数总是为每一行执行
谢谢。您混淆了两件不同的事情-执行计划的评估(这里就是这样)和实际数据的物理计划评估(这里没有)。必须始终评估执行计划,否则Spark将不知道如何生成相应的代码。另一方面,评估的不同分支可以从计划中删除,也可以在执行过程中跳过(使用标准控制流) 在您的案例中,计划完全无效,因为
None
不能用作文本。这并不意味着这类计划是如何根据实际数据进行评估的(实际上可能会短路,也可能不会短路,这取决于所使用的表达式)
事实上,在这种简单的情况下,当完全删除其他分支时,您可以很容易地检查优化的计划是否正确
spark.range(1)。选择(点亮时(真),1)。否则(2)为“x”)。解释(真)
spark.range(1)。选择(点亮时(假),1)。否则(2)为“x”)。解释(真)
但是,您不应该对此进行推断-某些执行模式(特别是UDF的某些变体)无法以这种方式进行优化
有关详细信息,请参阅。您混淆了两种不同的东西-执行计划的评估(这里就是这样)和实际数据的物理计划评估(这里没有)。必须始终评估执行计划,否则Spark将不知道如何生成相应的代码。另一方面,评估的不同分支可以从计划中删除,也可以在执行过程中跳过(使用标准控制流) 在您的案例中,计划完全无效,因为
None
不能用作文本。这并不意味着这类计划是如何根据实际数据进行评估的(实际上可能会短路,也可能不会短路,这取决于所使用的表达式)
事实上,在这种简单的情况下,当完全删除其他分支时,您可以很容易地检查优化的计划是否正确
spark.range(1)。选择(点亮时(真),1)。否则(2)为“x”)。解释(真)
spark.range(1)。选择(点亮时(假),1)。否则(2)为“x”)。解释(真)
但是,您不应该对此进行推断-某些执行模式(特别是UDF的某些变体)无法以这种方式进行优化
有关详细信息,请参阅。我在这里所说的一切都有效-执行计划评估!=根据实际数据对生成的代码进行评估。您的代码甚至没有达到“每行执行”的程度。我在这里所说的一切都是有效的-执行计划的评估!=根据实际数据对生成的代码进行评估。您的代码甚至没有达到“为每一行执行”的程度。
== Parsed Logical Plan ==
Project [CASE WHEN true THEN 1 ELSE 2 END AS x#10]
+- Range (0, 1, step=1, splits=Some(8))
== Analyzed Logical Plan ==
x: int
Project [CASE WHEN true THEN 1 ELSE 2 END AS x#10]
+- Range (0, 1, step=1, splits=Some(8))
== Optimized Logical Plan ==
Project [1 AS x#10]
+- Range (0, 1, step=1, splits=Some(8))
== Physical Plan ==
*(1) Project [1 AS x#10]
+- *(1) Range (0, 1, step=1, splits=8)
== Parsed Logical Plan ==
Project [CASE WHEN false THEN 1 ELSE 2 END AS x#14]
+- Range (0, 1, step=1, splits=Some(8))
== Analyzed Logical Plan ==
x: int
Project [CASE WHEN false THEN 1 ELSE 2 END AS x#14]
+- Range (0, 1, step=1, splits=Some(8))
== Optimized Logical Plan ==
Project [2 AS x#14]
+- Range (0, 1, step=1, splits=Some(8))
== Physical Plan ==
*(1) Project [2 AS x#14]
+- *(1) Range (0, 1, step=1, splits=8)