apache-spark - 在 Pyspark 中,从包含字符串列表的列中获取最频繁的字符串
问题描述
使用包含列的数据框,列中的值是列表,
id | values
1 | ['good','good','good','bad','bad','good','good']
2 | ['bad','badd','good','bad',Null,'good','bad']
....
如何获得列表中显示频率最高的字符串?预期输出:
id | most_frequent
1 | 'good'
2 | 'bad'
....
解决方案
我看不出有什么理由在explode
这里groupby
(计算密集的洗牌操作),Spark2.4+
我们可以用它higher order functions
来获得你想要的输出:
from pyspark.sql import functions as F
df\
.withColumn("most_common", F.expr("""sort_array(transform(array_distinct(values),\
x-> array(aggregate(values, 0,(acc,t)->acc+IF(t=x,1,0)),x)),False)[0][1]"""))\
.show(truncate=False)
#+---+----------------------------------------+-----------+
#|id |values |most_common|
#+---+----------------------------------------+-----------+
#|1 |[good, good, good, bad, bad, good, good]|good |
#|2 |[bad, badd, good, bad,, good, bad] |bad |
#+---+----------------------------------------+-----------+
我们也可以使用array_max
代替sort_array
。
from pyspark.sql import functions as F
df\
.withColumn("most_common", F.expr("""array_max(transform(array_distinct(values),\
x-> array(aggregate(values, 0,(acc,t)->acc+IF(t=x,1,0)),x)))[1]"""))\
.show(truncate=False)
推荐阅读
- ios-charts - 如何在 y 轴上显示从“零”开始的 barChart“”条
- objective-c - 如何在 macOS 的非主线程上有一个事件循环?
- numpy - 如何遍历多维数组并将结果保存在数组中?
- python - 尝试在 pycharm 上运行代码以及在 cmd 中键入 pip 时出错
- html - curl 不为某些网站返回任何输出
- c# - TimePicker C# XAML UWP 宽度自定义
- amazon-web-services - AWS Serverless Aurora - 与主节点的通信链路故障。找不到主节点的活动连接
- reactjs - Import' 和'export' 可能只出现在顶层。但它是在顶层和尽头。(盖茨比和反应 JS)
- python - 使用 Python 进行 SQL 注入
- oci8 - 在 Ubuntu 20.4 上安装 PHP 的 OCI8 扩展