Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL/Spark中使用窗口函数执行特定筛选器_Sql_Pyspark_Window Functions - Fatal编程技术网

在SQL/Spark中使用窗口函数执行特定筛选器

在SQL/Spark中使用窗口函数执行特定筛选器,sql,pyspark,window-functions,Sql,Pyspark,Window Functions,我目前有一个很大的数据集,但为了简单起见,它看起来是这样的: Person, Friend, Friendship_Score, Days_Known Alice, Bob, 120, 56 Alice, Candy, 20, 23 Bob, Daniel, 24, 77 Bob, Alice, 120, 56 Candy, Alice, 20, 23 Daniel, Bob, 24, 77 Daniel, Ed, 56, 65 Daniel, Fin, 52, 54 Daniel, Gin,

我目前有一个很大的数据集,但为了简单起见,它看起来是这样的:

Person, Friend, Friendship_Score, Days_Known
Alice, Bob, 120, 56
Alice, Candy, 20, 23
Bob, Daniel, 24, 77
Bob, Alice, 120, 56
Candy, Alice, 20, 23
Daniel, Bob, 24, 77
Daniel, Ed, 56, 65
Daniel, Fin, 52, 54
Daniel, Gin, 22, 50
...
Alice, Bob, 120, 56
Bob, Daniel, 24, 77
Bob, Alice, 120, 56
Candy, Alice, 20, 23
Daniel, Bob, 24, 77
Daniel, Ed, 56, 65
Daniel, Fin, 52, 54
我想在此数据集上使用一个窗口函数,使其如下所示:

Person, Friend, Friendship_Score, Days_Known
Alice, Bob, 120, 56
Alice, Candy, 20, 23
Bob, Daniel, 24, 77
Bob, Alice, 120, 56
Candy, Alice, 20, 23
Daniel, Bob, 24, 77
Daniel, Ed, 56, 65
Daniel, Fin, 52, 54
Daniel, Gin, 22, 50
...
Alice, Bob, 120, 56
Bob, Daniel, 24, 77
Bob, Alice, 120, 56
Candy, Alice, 20, 23
Daniel, Bob, 24, 77
Daniel, Ed, 56, 65
Daniel, Fin, 52, 54
过滤器背后的逻辑应该是,对于每个人,我们按照他们彼此认识的时间的顺序排列他们的朋友。已知值在顶部,然后只保留足够的朋友,以便他们的友谊得分为100

例如,Alice只需要Bob,因为她认识Bob最久,而且他们的友谊得分超过100分。鲍勃需要丹尼尔和爱丽丝,因为鲍勃认识丹尼尔的时间更长了,但他们的友谊分数只有24分。然而,在加上下一个认识时间最长的朋友Alice之后,Bob的友谊加起来就超过了100分


我知道我们需要做一些窗口函数和滚动求和,但我很难将这些想法转化为代码,我想知道是否有人能帮上忙。谢谢大家!

我对Spark没有太多经验,但文档表明它支持窗口函数和选择,您需要从中筛选窗口函数的结果

请注意,对于要保留的最后一条记录,使用下面的“窗口无界”运行“求和”到当前行会产生大于100的和。您确实希望使用不包含当前行的部分和来筛选和保留正确的记录。您可以使用SUM窗口函数完成此操作,然后从当前记录中减去分数。因此,窗口函数应该读取按人名按天数划分的SumFriendly_分数,将下面无边界的已知描述行读取到当前行-Friendly_分数作为之前的总分数

Select person, friend, friendship_score,days_known
From (
      Select *, SUM(friendship_score) OVER (Partition By person Order By Days_Known desc ROWS UNBOUNDED BELOW TO CURRENT ROW) - friendship_score as prior_total_score
      From MyTable
     )
Where prior_total_score < 100
您可以根据需要将Order By添加到外部选择