我是Spark的初学者,我尝试发出请求,允许我检索访问量最大的网页。
我的要求如下
mostPopularWebPageDF = logDF.groupBy("webPage").agg(functions.count("webPage").alias("cntWebPage")).agg(functions.max("cntWebPage")).show()
使用此请求,我只检索具有最大计数的数据框,但我想检索具有此分数的数据框和保存此分数的网页
类似的东西:
webPage max(cntWebPage)
google.com 2
如何解决问题?
非常感谢。
答案 0 :(得分:2)
在pyspark + sql中:
logDF.registerTempTable("logDF")
mostPopularWebPageDF = sqlContext.sql("""select webPage, cntWebPage from (
select webPage, count(*) as cntWebPage, max(count(*)) over () as maxcnt
from logDF
group by webPage) as tmp
where tmp.cntWebPage = tmp.maxcnt""")
也许我可以让它变得更干净,但它确实有效。我会尽力优化它。
我的结果:
webPage cntWebPage
google.com 2
表示数据集:
webPage usersid
google.com 1
google.com 3
bing.com 10
说明:通过分组+计数(*)功能进行正常计数。所有这些计数中的最大值是通过窗口函数计算的,因此对于上面的数据集,立即DataFrame /而不删除maxCount列/:
webPage count maxCount
google.com 2 2
bing.com 1 2
然后我们选择计数等于maxCount
的行 编辑:我删除了DSL版本 - 它不支持window over()并且订购正在改变结果。对不起,这个bug。 SQL版本是正确的