Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.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
Scala 如何在不同的分析函数上以最佳方式使用相同的窗口划分?_Scala_Apache Spark_Apache Spark Sql - Fatal编程技术网

Scala 如何在不同的分析函数上以最佳方式使用相同的窗口划分?

Scala 如何在不同的分析函数上以最佳方式使用相同的窗口划分?,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我对下面的代码有一个问题。我使用相同的windows分区,并在其上运行不同的函数,如max、min和row_number。Spark是每次我在withColumn中引用时都执行windows分区,还是在同一个windows分区上遇到多个函数时,它执行一次最佳的windows分区 val windows = Window.partitionBy("id").orderBy(col("date").desc) dataframe.withColumn("max", max(col("column1

我对下面的代码有一个问题。我使用相同的windows分区,并在其上运行不同的函数,如max、min和row_number。Spark是每次我在
withColumn
中引用时都执行windows分区,还是在同一个windows分区上遇到多个函数时,它执行一次最佳的windows分区

val windows = Window.partitionBy("id").orderBy(col("date").desc)

dataframe.withColumn("max", max(col("column1")).over(windows))
         .withColumn("min", min(col("column2")).over(windows))
         .withColumn("row_number", row_number().over(windows))

Spark将同时在同一窗口上进行所有聚合

我们可以通过检查catalyst准备的物理计划来确认这一点。Catalyst是一个优化引擎,它优化在数据集上执行的所有操作。您可以通过调用数据集上的
explain(true)
查看物理计划:

val df = List(("1", "2019-01-01", "100", "66"), ("2", "2019-01-02", "555", "444"))
           .toDF("id", "date", "column1", "column2")

val windows = Window.partitionBy("id").orderBy(col("date").desc)

dataframe.withColumn("max", max(col("column1")).over(windows))
     .withColumn("min", min(col("column2")).over(windows))
     .withColumn("row_number", row_number().over(windows))
     .explain(true)
在我的案例中,该计划如下所示:

== Physical Plan ==
Window [max(column1#26) windowspecdefinition(id#24, date#25 DESC NULLS LAST, specifiedwindowframe(RangeFrame, unboundedpreceding$(), currentrow$())) AS max#503, min(column2#27) windowspecdefinition(id#24, date#25 DESC NULLS LAST, specifiedwindowframe(RangeFrame, unboundedpreceding$(), currentrow$())) AS min#510, row_number() windowspecdefinition(id#24, date#25 DESC NULLS LAST, specifiedwindowframe(RowFrame, unboundedpreceding$(), currentrow$())) AS row_number#518], [id#24], [date#25 DESC NULLS LAST]
+- *(1) Sort [id#24 ASC NULLS FIRST, date#25 DESC NULLS LAST], false, 0
   +- Exchange hashpartitioning(id#24, 200)
      +- LocalTableScan [id#24, date#25, column1#26, column2#27]
如您所见,Spark将执行以下步骤:

  • 对整个数据集排序
  • id上的分区数据集
  • 遍历数据集中的所有行(扫描)以执行聚合