UDAF可以在SPARK SQL 2.2.0中返回复杂类型吗?

时间:2018-02-10 13:27:22

标签: apache-spark

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查询中使用它。

1 个答案:

答案 0 :(得分:2)

您的要求不需要

UDAF。只需使用groupByaggsumcollect_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))            |
+---+-------------------------------------------+