我想创建一个 Map
计算出现次数的列。
例如:
+---+----+
| b| a|
+---+----+
| 1| b|
| 2|null|
| 1| a|
| 1| a|
+---+----+
会导致
+---+--------------------+
| b| res|
+---+--------------------+
| 1|[a -> 2.0, b -> 1.0]|
| 2| []|
+---+--------------------+
目前,在spark2.4.6中,我能够使用udaf实现它。
当我碰到spark3的时候,我想知道我是否能摆脱这个udaf(我试着使用新方法) aggregate
没有成功)
有没有有效的方法(对于效率部分,我可以很容易地测试)
4条答案
按热度按时间rqenqsqc1#
你可以随时使用
collect_list
使用自定义项,但前提是您的分组不太大:给予:
这应该比udaf:spark custom aggregation:collect\u list+udf vs udaf快
w46czmvw2#
以下是spark 3解决方案:
给予:
这里的解决方案使用
Aggregator
:给予:
dxpyg8gm3#
这里有一个单一的解决方案
groupBy
以及一个稍微复杂的sql表达式。此解决方案适用于spark 2.4+输出:
这个想法是从专栏文章中收集数据
a
两次:一次进入一个集合,一次进入一个列表。然后借助于集合中每个元素的变换,计算列表中特定元素的出现次数。最后,将集合和元素数与来自\数组的map\相结合。但是,我不能说这种方法是否真的比udaf快。
dddzy1tm4#
我们能做到的就是spark 2.4