【问题标题】:Can UDAF's return complex types in SPARK SQL 2.2.0?UDAF 可以在 SPARK SQL 2.2.0 中返回复杂类型吗?
【发布时间】:2018-02-10 21:58:16
【问题描述】:

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

【问题讨论】:

  • 您根本不能在DataFrame 中拥有Map(key -> 50, value -> [foo, car, bus])。所有值必须属于同一类型。如果有的话,它应该是结构。
  • 这里不是所有的值都相同吗?哪个是数组?
  • 显然array<string> (value) 与key (数字) 的类型不同。
  • 键和值必须是同一类型?我不知道。我认为所有的键都应该是相同的类型,比如 type1,所有的值都应该是相同的类型,比如 type2..如果你是对的,下面的解决方案为什么能够做到?
  • 没有。答案中的表示是Map(50 -> [foo, car, bus]) 而不是Map(key -> 50, value -> [foo, car, bus])

标签: apache-spark


【解决方案1】:

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))            |
+---+-------------------------------------------+

【讨论】:

  • 嗨!非常感谢你做的这些。我唯一询问 UDAF 是因为我有一个自定义计算,除了 sum 之外我还需要做,所以我想知道如果是这种情况,你的解决方案会如何改变?
  • 这取决于你有什么计算。
  • 就像 sum 如何对数量列中的组进行运算并为每个组返回一个整数。请想象我有一个自定义函数,它可以对一个组进行操作并返回一个整数。自定义函数通常对特定组中的所有值应用一些位运算符并返回一个整数。现在这样有意义吗?
  • 我可以建议收集金额列表并将其传递给 udf 函数,您可以在其中进行按位计算。如果您可以应用内置功能,那就更好了。所以你可以接受这个答案在另一个问题中提出你的要求,我会帮你的。
  • 不知道可以select custom_udf(amount) as custom_calculation, collect_list(name) as my_sum_along_with_names from df group by id吗?
猜你喜欢
  • 2018-09-14
  • 2018-03-22
  • 2017-03-27
  • 1970-01-01
  • 2017-02-06
  • 1970-01-01
  • 1970-01-01
  • 2018-03-10
  • 2018-11-29
相关资源
最近更新 更多