Apache spark [Py]Spark-SQL:使用框架';s输入行
我想根据当前输入行约束聚合函数使用窗口框架中的哪些行。例如,给定一个数据帧Apache spark [Py]Spark-SQL:使用框架';s输入行,apache-spark,pyspark,apache-spark-sql,spark-dataframe,Apache Spark,Pyspark,Apache Spark Sql,Spark Dataframe,我想根据当前输入行约束聚合函数使用窗口框架中的哪些行。例如,给定一个数据帧df和一个窗口w,我希望能够执行以下操作: df2 = df.withColumn("foo", first(col("bar").filter(...)).over(w)) 其中,.filter将根据当前窗口框架的输入行从该框架中删除行 我的具体用例如下:给定一个数据帧df +-----+--+--+ |group|n1|n2| +-----+--+--+ | 1| 1| 6| | 1| 0| 3| |
df
和一个窗口w
,我希望能够执行以下操作:
df2 = df.withColumn("foo", first(col("bar").filter(...)).over(w))
其中,.filter
将根据当前窗口框架的输入行从该框架中删除行
我的具体用例如下:给定一个数据帧df
+-----+--+--+
|group|n1|n2|
+-----+--+--+
| 1| 1| 6|
| 1| 0| 3|
| 1| 2| 2|
| 1| 3| 5|
| 2| 0| 5|
| 2| 0| 7|
| 2| 3| 2|
| 2| 5| 9|
+-----+--+--+
窗口
w = Window.partitionBy("group")\
.orderBy("n1", "n2")\
.rowsBetween(Window.currentRow + 1, Window.unboundedFollowing)
和一些正长的i
,您如何在每个输入行r
的框架中找到第一行(fr
),从而r.n1
fr.n1
,r.n2
fr.n2
,以及max(fr.n1
-r.n1
,fr.n2
)?返回的值可以是fr.n1
或df
中的fr
行索引。因此,对于i
=6,示例df
的输出将是
+-----+--+--+-----+
|group|n1|n2|fr.n1|
+-----+--+--+-----+
| 1| 1| 6| null|
| 1| 0| 3| 1|
| 1| 2| 2| 3|
| 1| 3| 5| null|
| 2| 0| 5| 5|
| 2| 0| 7| 5|
| 2| 3| 2| null|
| 2| 5| 9| null|
+-----+--+--+-----+
我一直在研究Spark API并查看和的示例,但我似乎无法将其组合在一起。这在窗口和聚合函数中是可能的,还是我完全偏离了标准?仅使用窗口函数和聚合是无法做到的,您需要一个自连接: 对于连接:
df=sc.parallelize([[1,1,6],[1,0,3],[1,2,2],[1,3,5],[2,0,5],[2,0,7],[2,3,2],[2,5,9]).toDF([“组”,“n1”,“n2”])
将pyspark.sql.functions作为psf导入
df_r=df.select([df[c]。df.columns中c的别名(“r_”+c)))
df_join=df_r\
.join(df,(df_r.r_group==df.group)
&(df_r.r_n1
现在我们可以应用window函数仅保留第一行:
w=Window.partitionBy(“r_组”、“r_n1”、“r_n2”)。orderBy(“n1”、“n2”)
res=df\u连接\
.带列(“rn”,psf.行号(),在(w)上方)\
.过滤器(“rn=1”).下降(“rn”)
+-------+----+----+----+----+
|r|u群| r|n1 | r|n2 | n1 | n2|
+-------+----+----+----+----+
| 1| 0| 3| 1| 6|
|1 | 1 | 6 |空|空|
| 1| 2| 2| 3| 5|
|1 | 3 | 5 |空|空|
| 2| 0| 5| 5| 9|
| 2| 0| 7| 5| 9|
|2 | 3 | 2 |空|空|
|2 | 5 | 9 |空|空|
+-------+----+----+----+----+
你能举例说明你真正想做什么吗?现在给出的问题我不清楚。如果|2 | 3 | 2 | 5 |
是真的,那么|1 | 2 | 2 | 3 |
为什么是真的?反之亦然。他们互相矛盾。请回顾你的最终df.Oops!我将原始示例解决方案更新为正确的。我在开头的一般描述中还添加了一个例子,希望能让事情变得更清楚。谢谢你的回答。这是有道理的,它将需要一个连接,因为这是有效的过滤窗口框架将要做的,至少在我的具体情况下。