【发布时间】:2017-12-18 22:09:30
【问题描述】:
我有一个包含start_time 和end_time 列的DataFrame。我想设置窗口,每个观察的窗口是结束时间之前的两行,仅限于在观察的start_time 之前带有end_time 的数据。
示例数据:
data = [('a', 10, 12, 5),('b', 20, 25, 10),('c', 30, 60, 15),('d', 40, 45, 20),('e', 50, 70, 25)]
df = sqlContext.createDataFrame(data, ['name', 'start_time', 'end_time', 'resource'])
+----+----------+--------+--------+
|name|start_time|end_time|resource|
+----+----------+--------+--------+
| a| 10| 12| 5|
| b| 20| 25| 10|
| c| 30| 60| 15|
| d| 40| 45| 20|
| e| 50| 70| 25|
+----+----------+--------+--------+
所以'e'的窗口应该包括'b'和'd',而不是'c'
不受结束时间
from pyspark.sql import Window
from pyspark.sql import functions as func
window = Window.orderBy("name").rowsBetween(-2, -1)
df.select('*', func.avg("resource").over(window).alias("avg")).show()
我查看了rangeBetween(),但我无法找到引用当前行的start_time 的方法,或者我想通过其他行的end_time 来限制它。有Window.currentRow,但在这个例子中它只会引用resource的值
这可以使用 Window 来实现吗?我应该完全尝试其他东西吗?
编辑:如果重要,请使用 Spark 2.1.1 和 Python 2.7+。
【问题讨论】:
-
partitionBy是什么?没有它,您最终会在同一个分区和单个执行程序上得到所有行,这将用大型数据集杀死它。 -
是的,我的实际数据非常大,所以我有一个
partitionBy似乎工作正常 - 它是name的组,每个组都有一个 a、b、c,等等。当我运行代码而不受只考虑结束时间
标签: apache-spark pyspark spark-dataframe window-functions pyspark-sql