首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将数据帧列聚合为具有计数的列表的新列?

如何将数据帧列聚合为具有计数的列表的新列?
EN

Stack Overflow用户
提问于 2019-10-30 10:05:52
回答 2查看 53关注 0票数 1

我在scala中有一个星星之火数据框架,类似:

代码语言:javascript
运行
复制
URL       Browser
A         Chrome
B         Chrome 
C         Firefox
A         Chrome
A         Firefox
A         Opera
A         Chrome
B         Chrome
B         Firefox
C         Tor

URL列的数据范围很广,但浏览器列的集合有限。我希望在URL列上聚合,并按降序获取列表中每个浏览器的顶部计数,如下所示:

代码语言:javascript
运行
复制
URL      FrequentlyUsedBrowser 
A        [(Chrome,3),(Firefox,1),(Opera,1)]
B        [(Chrome,2),(Firefox,1)]
C        [(Chrome,1),(Tor,1)] 

我一直在为它编写SQL,以便使用窗口分区将计数作为每个浏览器的一个条目,但无法将其放入列表中。

这是针对运行Spark2.4和Scala2.11的集群的

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-30 10:44:02

您可以通过使用collect_list和按sort_array进行排序来实现它。

代码语言:javascript
运行
复制
  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)]              |
+---+------------------------------------+
票数 1
EN

Stack Overflow用户

发布于 2019-10-31 09:39:06

我对@chlebek的回答做了修改,增加了一份订单,所以它现在对我来说是完美的。列表现在也被排序了。谢谢!!

代码语言:javascript
运行
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58622884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档