Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark Spark Othery()始终处于求值状态_Apache Spark_Apache Spark Sql - Fatal编程技术网

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)