我在scala中有一个星星之火数据框架,类似:
URL Browser
A Chrome
B Chrome
C Firefox
A Chrome
A Firefox
A Opera
A Chrome
B Chrome
B Firefox
C Tor
URL列的数据范围很广,但浏览器列的集合有限。我希望在URL列上聚合,并按降序获取列表中每个浏览器的顶部计数,如下所示:
URL FrequentlyUsedBrowser
A [(Chrome,3),(Firefox,1),(Opera,1)]
B [(Chrome,2),(Firefox,1)]
C [(Chrome,1),(Tor,1)]
我一直在为它编写SQL,以便使用窗口分区将计数作为每个浏览器的一个条目,但无法将其放入列表中。
这是针对运行Spark2.4和Scala2.11的集群的
发布于 2019-10-30 10:44:02
您可以通过使用collect_list
和按sort_array
进行排序来实现它。
df.withColumn("num", lit(1))
.groupBy('url, 'browser)
.agg(sum('num).as("num"))
.select('url, format_string("(%s)",concat_ws(",", 'browser, 'num)).as("dst"))
.groupBy('url)
.agg(sort_array(collect_list('dst))).toDF("URL","FrequentlyUsedBrowser")
.orderBy('url)
.show(false)
+---+-------+
|url|browser|
+---+-------+
| A| Chrome|
| B| Chrome|
| C|Firefox|
| A| Chrome|
| A|Firefox|
| A| Opera|
| A| Chrome|
| B| Chrome|
| B|Firefox|
| C| Tor|
+---+-------+
+---+------------------------------------+
|URL|FrequentlyUsedBrowser |
+---+------------------------------------+
|A |[(Chrome,3), (Firefox,1), (Opera,1)]|
|B |[(Chrome,2), (Firefox,1)] |
|C |[(Firefox,1), (Tor,1)] |
+---+------------------------------------+
发布于 2019-10-31 09:39:06
我对@chlebek的回答做了修改,增加了一份订单,所以它现在对我来说是完美的。列表现在也被排序了。谢谢!!
df.withColumn("num", lit(1))
.groupBy('url, 'browser)
.agg(sum('num)
.as("num"))
.orderBy('num.desc)
.select('url, format_string("(%s)",concat_ws(",", 'browser, 'num))
.as("dst"))
.groupBy('url)
.agg(collect_list('dst))
.toDF("URL","FrequentlyUsedBrowser")
.orderBy('url).show(false)
https://stackoverflow.com/questions/58622884
复制相似问题