【发布时间】:2020-04-09 16:33:28
【问题描述】:
我在其他帖子中看到过为数据框完成此操作:https://stackoverflow.com/a/52992212/4080521
但我想弄清楚如何为累积产品编写 udf。
假设我有一个非常基本的表格
Input data:
+----+
| val|
+----+
| 1 |
| 2 |
| 3 |
+----+
如果我想取这个总和,我可以简单地做类似的事情
sparkSession.createOrReplaceTempView("table")
spark.sql("""Select SUM(table.val) from table""").show(100, false)
这很有效,因为 SUM 是一个预定义的函数。
我如何为乘法定义类似的东西(或者我自己如何在UDF 中实现求和)?
尝试以下方法
sparkSession.createOrReplaceTempView("_Period0")
val prod = udf((vals:Seq[Decimal]) => vals.reduce(_ * _))
spark.udf.register("prod",prod)
spark.sql("""Select prod(table.vals) from table""").show(100, false)
我收到以下错误:
Message: cannot resolve 'UDF(vals)' due to data type mismatch: argument 1 requires array<decimal(38,18)> type, however, 'table.vals' is of decimal(28,14)
显然每个特定的单元格不是一个数组,但似乎 udf 需要接受一个数组来执行聚合。 spark sql 甚至可以吗?
【问题讨论】:
标签: apache-spark apache-spark-sql user-defined-functions