如何正确地获得列值作为Map(k->v),其中k是唯一值,v是出现计数?我是在groupby里面做的。
val getMapUDF = udf((arr: Array[Long]) => {arr.groupBy(identity).map{ case (x,y) => x -> y.size}})
df
.withWatermark("time", "30 seconds")
.groupBy(window(col("time"), "1 minutes").alias("someTime"), col("foo"), col("bar"))
.agg(count("*").alias("rowCount"), collect_list(col("aaa")).alias("aaaList"))
.withColumn("qtypes", getMapUDF(col("foobar")))
编辑:输入
+-----------+-------------------+
| foo | bar | foobar |
+-----------+-------------------+
| aaa | a | [1,1,1,2,3,3] |
| bbb | b | [1,2,3,1,2] |
+-----------+-------------------+
预期产量
+-----------+--------------------+
| foo | bar | foobarMap |
+-----------+--------------------+
| aaa | a | [1->3, 2->1, 3->2] |
| bbb | b | [1->2, 2->2, 3->1] |
+-----------+--------------------+
问:我能用一下吗 map_from_arrays
?
3条答案
按热度按时间dsekswqp1#
考虑到数组arr,你认为这就是你要找的吗
vsnjm48y2#
我想可以做点什么来代替
collect_list
这样你就可以得到你想要的而不必做2groupBy
. 我假设你的输入数据df
在下面。要添加水印和按窗口分组,可以按以下方式实现代码:
iyr7buue3#
因此,如果您只想用sparksqlapi/列转换来替换udf,这可能就是您想要的
所以你会收到这个
希望这对你有所帮助