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!我将原始示例解决方案更新为正确的。我在开头的一般描述中还添加了一个例子,希望能让事情变得更清楚。谢谢你的回答。这是有道理的,它将需要一个连接,因为这是有效的过滤窗口框架将要做的,至少在我的具体情况下。