首页 > 解决方案 > Databricks 中 pyspark 中对有序窗口求和的问题

问题描述

编辑:我明白了。我一直在阅读文档很差,因为有序窗口的默认框架是 rangeFrame 而不是 rowFrame。

首先,我要感谢这个社区提出的精彩问题和答案。我学习 pyspark 才几个月,我发现这个网站真的很有帮助。

我在 Databricks 中使用 spark 2.4.5。

根据将 Window 与 OrderBy 一起使用时的文档,默认情况下框架应为 unboundedPreceding、currentRow。但这似乎并非如此,或者这些是其他错误。当我明确定义框架时,我得到的结果与依赖默认值时不同。

这是一个示例代码:

import pyspark.sql.functions as F
import pyspark.sql.window as W
df = spark.range(0, 1000)
#partitionBy and orderBy columns
for k in ['a','e']:
  df=df.withColumn(k, (F.rand()*10).cast('int'))
#column for the sum, 0's and 1's
df=df.withColumn('o', (F.round(F.pow(F.rand(),10)) ).cast('int'))
#two ways to count the sum
w=W.Window.partitionBy('a').orderBy('e').rowsBetween(W.Window.unboundedPreceding, W.Window.currentRow)      
df = df.withColumn('sum', F.sum('o').over(w))

w2=W.Window.partitionBy('a').orderBy('e')      
df = df.withColumn('sum2', F.sum('o').over(w2))

display(df.orderBy('a','e', 'sum'))

如果您比较 sum 和 sum2 值,您会发现它们并不总是相同的。所以我的问题是:这真的是一个错误还是我误解了某些东西,或者在 Databricks 中是否存在不同的默认值

标签: pysparksumwindowsql-order-by

解决方案


推荐阅读