如何在impala中编写javaudf

wdebmtf2  于 2021-06-26  发布在  Impala
关注(0)|答案(1)|浏览(396)

我想实施 running total 中的示例 Impala 如下所示:

DATE        |   DAY |   COUNT   |   Total
2014-11-12  |   1   |   12      |   12
2014-11-13  |   2   |   32      |   44
2014-11-14  |   3   |   50      |   94

To solve this problem using Impala, we might need temp variable like in MySql, which Impala does not support.

为此,我想使用javaudf将第一行总计与第二行计数相加。这样我就能得到第二排的总数。我怎么能这么做。请建议。还请提供以下步骤: add jar 进入 Impala . 你的帮助会很有帮助的。

qlckcl4x

qlckcl4x1#

如果您使用的是Impala2.0,那么可以使用分析(窗口)函数计算运行总数。
例如, select date, day, count, sum(count) over (order by date) from your_table 有关分析函数的更多信息,请参阅impala文档。
更新:
使用uda不可能以您想要的方式实现累积和,这就是“分析/窗口函数”存在的原因。为什么?uda用于为聚合编写自定义函数,该聚合通过某个表达式将输入行分组,并将聚合fn应用于同一组中的所有行,但只为该组生成一个输出行。这有两个问题:
您需要为每一个输入行设置一个输出行,其中每一行的累计和都会更新。考虑以下带有聚合的查询:
mytable的sum(x);10
年龄,按年龄分组计算(*);14, 1 15, 10 16, 11
注意聚合是如何“折叠”许多行并计算整个集合上的函数(例如sum或count)。
在计算累计和时,需要在日期对行进行排序。如前所述,聚合将聚合fn应用于具有相同分组表达式的一组行,但它们可以按任何顺序应用。分析函数允许您将函数按指定顺序应用于一组行,这是计算所需的累积和所需的。
也就是说,在这种情况下,您可以使用自联接来生成所需的累计和。例如:

> select t1.id, sum(t2.id) as csum from tbl t1 inner join tbl t2 on t1.id >= t2.id group by t1.id order by t1.id;
+----+------------+
| id | csum       |
+----+------------+
| 0  | 0          |
| 1  | 1          |
| 2  | 3          |
| 3  | 6          |
| 4  | 10         |
| 5  | 15         |
| 6  | 21         |
| 7  | 28         |
+----+------------+

但是,这可能需要花费大量的计算时间,并且很难用sql表示。理想情况下,您可以升级到Impala2.0并使用分析函数。

相关问题