【发布时间】:2021-06-04 11:09:58
【问题描述】:
这两个实现几乎一样(唯一不同的是行的顺序):
import org.apache.spark.sql.expressions._
import org.apache.spark.sql.functions._
def windowSpec = Window.partitionBy("key")
val df1 = Seq((3, "A", 5), (1, "A", 2), (3, "A", 5), (3, "B", 13)).toDF("key", "Categ1", "value")
df1.withColumn("avg", avg("value").over(windowSpec)).show
+---+------+-----+-----------------+
|key|Categ1|value| avg|
+---+------+-----+-----------------+
| 1| A| 2| 2.0|
| 3| A| 5|7.666666666666667|
| 3| A| 5|7.666666666666667|
| 3| B| 13|7.666666666666667|
+---+------+-----+-----------------+
和
import org.apache.spark.sql.expressions._
import org.apache.spark.sql.functions._
val df1 = Seq((3, "A", 5), (1, "A", 2), (3, "A", 5), (3, "B", 13)).toDF("key",
val df2 = df1.groupBy("key").agg(avg("value") as "avg")
df1.join(df2, Seq("key")).show
+---+------+-----+-----------------+
|key|Categ1|value| avg|
+---+------+-----+-----------------+
| 3| A| 5|7.666666666666667|
| 1| A| 2| 2.0|
| 3| A| 5|7.666666666666667|
| 3| B| 13|7.666666666666667|
+---+------+-----+-----------------+
乍一看,我认为第一个应该更快,因为它避免了join,但根据经验,有时会得出不同的结论。
window func 有额外的开销吗? window func 和 groupBy 之间是否存在复杂性差异?谢谢。
附带问题
使用window func时是否无法保证类型安全?
相关:How use Window aggrgates on strongly typed Spark Datasets?
【问题讨论】:
-
@Hogan 你说的是哪种索引? Spark 中没有索引的概念——Spark 不是数据库,而是支持 SQL 的批处理框架。
标签: sql apache-spark group-by window-functions static-typing