【问题标题】:how to write java udf in impala如何在impala中编写java udf
【发布时间】:2014-11-25 07:34:57
【问题描述】:

我想在Impala 中实现running total 示例,如下所示:

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 jar 转换为Impala 的步骤。 您的帮助将非常有帮助。

【问题讨论】:

    标签: java hive impala


    【解决方案1】:

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

    例如,

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

    有关分析函数的更多信息,请参阅Impala documentation

    更新:

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

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

      sum(x) 来自 mytable; 10

      age, count(*) 从学生按年龄分组; 14, 1 15, 10 16、11

      请注意聚合如何“折叠”许多行并在整个集合中评估函数(例如 sum 或 count)。

    2. 在计算累积和时,您需要在日期对行进行排序。正如我所提到的,聚合将聚合 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 表达。理想情况下,您可以升级到 Impala 2.0 并使用分析功能。

    【讨论】:

    • 对不起,我应该提到 Impala 的版本。我目前正在使用我的 AWS EMR 现在支持的版本 1.2.4。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多