我目前有一个大型数据集,但为了简单起见,它看起来如下所示:
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
过滤器背后的逻辑应该是,对于每个人,我们按照他们认识的时间长短对他们的朋友进行排序(较高的days_knowled
值位于顶部),然后只保留足够的朋友,以便他们的friendship_score
为100。
例如,Alice只需要Bob,因为她认识他的时间最长,而且他们的friendship_score
超过100。Bob需要Daniel和Alice,因为Bob认识Daniel的时间更长,但是他们的Friendship_Score
只有24。但是,在添加Alice之后,Bob认识的时间最长的下一个朋友,Friendship_Score
的组合值高于100。
我知道我们需要做一些窗口函数和滚动求和,但我很难把这些想法放进代码中,想知道是否有人可以帮助这一点。谢谢!
我对Spark没有太多的经验,但文档表明它既支持窗口函数,也支持从选择中选择,您需要从选择中选择来筛选窗口函数的结果。
请注意,使用window UNBOUNDED TO CURRENT ROW的运行总和将为要保留的最后一条记录生成一个大于100的总和。您确实需要不包括当前行的部分和来筛选和保留正确的记录。您可以使用求和窗口函数来完成此操作,然后从当前记录中减去得分。因此,您的窗口函数应该将SUM(friendship_score)读取为prior_total_score(按人分区、按天排序_knowled desc行,下面无界到当前行)-friendship_score(prior_total_score)
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。
我在Scala中查看幻灯片函数中的Spark。
使用https://stackoverflow.com/a/32407543/5379015中提供的解决方案,我尝试重新创建相同的查询,但使用编程语法代替API,如下所示: 第一个工作正常,但是结果是
我有一个以下数据(alldata),它有SQL查询和视图名称。 我已经拆分并正确地将其分配给诱惑(alldata) 当我尝试执行查询并从中注册tempview或表时,它显示空指针错误。但是当我注释掉spark时,PRINTLN显示了表中的所有值。sql语句。 但是当我用spark.sql执行它时,它会显示以下错误,请帮助我出错的地方。 19/12/09 02:43:12错误执行器:在阶段4.0任务
问题内容: 从EMPLOYEE表中,我想对记录的数量(雇用的雇员)进行分组,并且还需要每天运行的TOTAL。输入的格式如下: 所需的输出: 每天的分组没有问题: 问题 :如何使用窗口功能获得总计(在最后一栏中) 问题答案: http://sqlfiddle.com/#!4/4bd36/9