Apache spark 火花窗功能:每帧/范围计算一次?
这是一个关于Spark中窗口函数的问题 假设我有这个DFApache spark 火花窗功能:每帧/范围计算一次?,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,这是一个关于Spark中窗口函数的问题 假设我有这个DF DATE_S | ID | STR | VALUE ------------------------- 1 | 1 | A | 0.5 1 | 1 | A | 1.23 1 | 1 | A | -0.4 2 | 1 | A | 2.0 3 | 1 | A | -1.2 3 | 1 | A | 0.523 1 | 2 | A |
DATE_S | ID | STR | VALUE
-------------------------
1 | 1 | A | 0.5
1 | 1 | A | 1.23
1 | 1 | A | -0.4
2 | 1 | A | 2.0
3 | 1 | A | -1.2
3 | 1 | A | 0.523
1 | 2 | A | 1.0
2 | 2 | A | 2.5
3 | 2 | A | 1.32
3 | 2 | A | -3.34
1 | 1 | B | 1.5
1 | 1 | B | 0.23
1 | 1 | B | -0.3
2 | 1 | B | -2.0
3 | 1 | B | 1.32
3 | 1 | B | 523.0
1 | 2 | B | 1.3
2 | 2 | B | -0.5
3 | 2 | B | 4.3243
3 | 2 | B | 3.332
这只是一个例子!假设每个(ID,STR)有更多的日期,更多的ID和STR,每个(DATE,ID,STR)有更多的条目。显然,每个组合有多个值(日期、ID、STR)
现在我这样做:
val w = Window.partitionBy("ID", "STR").orderBy("DATE_S").rangeBetween(-N, -1)
df.withColumn("RESULT", function("VALUE").over(w))
其中,N可能导致包含大量行,从100行到100000行甚至更多,具体取决于(“ID”、“STR”)
结果会是这样
DATE_S | ID | STR | VALUE | RESULT
----------------------------------
1 | 1 | A | 0.5 | R1
1 | 1 | A | 1.23 | R1
1 | 1 | A | -0.4 | R1
2 | 1 | A | 2.0 | R2
3 | 1 | A | -1.2 | R3
3 | 1 | A | 0.523 | R3
1 | 2 | A | 1.0 | R4
2 | 2 | A | 2.5 | R5
3 | 2 | A | 1.32 | R6
3 | 2 | A | -3.34 | R7
1 | 1 | B | 1.5 | R8
1 | 1 | B | 0.23 | R8
1 | 1 | B | -0.3 | R9
2 | 1 | B | -2.0 | R10
3 | 1 | B | 1.32 | R11
3 | 1 | B | 523.0 | R11
1 | 2 | B | 1.3 | R12
2 | 2 | B | -0.5 | R13
3 | 2 | B | 4.3243| R14
3 | 2 | B | 3.332 | R14
存在相同的“结果”,因为对于具有相同(日期、ID、ST)的每一行,“函数”计算中的值是相同的
我的问题是:
spark是为每一行调用“函数”(多次重新计算相同的值)还是为每一个值范围(帧?计算一次,然后将它们粘贴到该范围内的所有行上
感谢阅读:)根据您的数据,如果从我所看到的数据中运行两次,结果可能不一样,因为没有明显的排序可能性。但我们把它放在一边 虽然存在codegen优化,但在任何地方都找不到它以您声明的方式检查下一次调用是否是下一行要处理的同一组数据。我从未读过这种类型的优化。由于懒惰的评估方法,存在融合,但这是另一回事。因此,每行它会再次计算 从一个伟大的来源: 。。。在其核心,窗口函数计算每个窗口的返回值 基于一组行(称为帧)的表的输入行。每一个 输入行可以有一个与之关联的唯一帧 。。。换句话说,当执行时,窗口函数计算一个值 对于窗口中的每一行(根据窗口规格)
最大的问题是有适当数量的分区用于并行处理,这很昂贵,但这是大数据
partitionBy(“ID”,“STR”)
是这里的线索,这是一件好事。可能是一个展示计算的想法……你认为它重要吗,特别是对于第一个问题?实际上我只是想把这个问题说得更笼统一些。我正在做两件事:1)平均值2)callUDF(“百分位数”,col(“值”),typedLit(数组(0.25,0.5,0.75)))我编辑了这篇文章,以反映我目前感兴趣的主要问题是问题1)我刚刚更新了自己关于百分位数的知识,很久以前在大学统计中。范围似乎很小。范围只是为了说明问题,因为我不想做一个范围为90的示例df,每个日期大约有100-10000个条目。这首先与“非常昂贵的操作”的实际结果无关。感谢您的洞察力和链接!这实际上是一个很好的来源,你是正确的,一个独特的顺序是不可能的。但是,如果“操作”不依赖于顺序(1+2=2+1),则这不重要。但我明白了重点,spark无法知道“操作”是否取决于订单。但是它可以知道像sum或avg这样的内置函数(只要我们忽略浮点错误,它就不依赖于顺序)成功了,如果你看看我的其他一些答案,你会发现我走上了这类事情的道路。你甚至可以回避一些问题。