Я видел в других постах, что это делается для фреймов данных: { ссылка }
Но я пытаюсь выяснить, как я могу написать udf для кумулятивного продукта.
Если у меня есть очень базовый c стол
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)
Очевидно, что каждая указанная c ячейка не является массивом, но, похоже, udf должен принимать массив для выполнения агрегации. Возможно ли это даже при искре sql?