UDAF可以返回复杂类型吗?比如说一个带有键作为整数的Map和作为一个字符串数组的值?
例如说我有以下输入数据框
id | name | amount
-------------------------
1 | foo | 10
2 | bar | 15
1 | car | 20
1 | bus | 20
我的目标/输出数据框是
id | my_sum_along_with_names
-------------------------------------------------------------
1 | Map(key -> 50, value -> [foo, car, bus])
2 | Map(key -> 15, value -> [bar])
我正在寻找一个UDAF解决方案,所以我可以在我的原始SQL查询中使用它。
答案 0 :(得分:2)
UDAF
。只需使用groupBy
,agg
,sum
和collect_list
内置函数,最后使用map
即可实现内置功能。
import org.apache.spark.sql.functions._
df.groupBy("id").agg(sum("amount").as("key"), collect_list("name").as("value"))
.select(col("id"), map(col("key"), col("value")).as("my_sum_along_with_names"))
.show(false)
会导致
+---+-------------------------------------------+
|id |my_sum_along_with_names |
+---+-------------------------------------------+
|1 |Map(50.0 -> WrappedArray( foo, car, bus))|
|2 |Map(15.0 -> WrappedArray( bar)) |
+---+-------------------------------------------+