如何在impala中编写java udf

时间:2014-11-25 07:34:58

标签: java hive impala

我想在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.

为此,我想使用java udf添加第一行总计和第二行计数。所以我将获得第二排。我怎么能这样做请建议。 另请提供add jarImpala的步骤。 您的帮助将非常有用。

1 个答案:

答案 0 :(得分:1)

如果您正在使用Impala 2.0,则可以使用分析(窗口)函数计算运行总计。

例如,

select date, day, count, sum(count) over (order by date) from your_table

有关分析函数的详细信息,请参阅Impala documentation

更新

无法以您希望的方式使用UDA实现累积总和,这就是分析/窗口功能'存在。为什么? UDA用于为聚合编写自定义函数,这些函数通过某个表达式对输入行进行分组,并将聚合fn应用于同一组中的所有行,但只为该组生成一个输出行。这有两个问题:

  1. 您希望每个输入行都有一个输出行,其中每行都会更新累积和。请考虑以下具有聚合的查询:

      

    来自mytable的sum(x);   10

         

    年龄,按年龄划分的学生人数(*);   14,1   15,10   16,11

    注意聚合'崩溃'多个行并评估整个集合的函数(例如总和或计数)。

  2. 您需要在计算累积总和的日期订购行。正如我所提到的,聚合将聚合fn应用于具有相同分组表达式的一组行,但它们可以按任何顺序应用。分析函数允许您按指定顺序将函数应用于一组行,这是计算所需累积总和所需的行。

  3. 也就是说,在这种情况下,您可以使用自联接来生成所需的累积总和。例如:

    > 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中更难表达。理想情况下,您只需升级到Impala 2.0并使用分析函数。