如何在impala中编写java udf

Posted

技术标签:

【中文标题】如何在impala中编写java udf【英文标题】:how to write java udf in impala 【发布时间】: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 的步骤。 您的帮助将非常有帮助。

【问题讨论】:

【参考方案1】:

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

例如,

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

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

更新:

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

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

    sum(x) 来自 mytable; 10

    age, count(*) 从学生按年龄分组; 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 表达。理想情况下,您可以升级到 Impala 2.0 并使用分析功能。

【讨论】:

对不起,我应该提到 Impala 的版本。我目前正在使用我的 AWS EMR 现在支持的版本 1.2.4。

以上是关于如何在impala中编写java udf的主要内容,如果未能解决你的问题,请参考以下文章

0011-如何在Hive & Impala中使用UDF

自动增量 UDF 在 hive 中工作,但在 Impala 中返回 null

用java编写的hive udf、udaf、udtfs如何在eclipse之类的ide中调试?

如何使用 Hive 上下文中的 Pyspark 调用用 Java 编写的 Hive UDF

如何在 Python Impala 中编写 FOR 循环?

如何在 Hive 中重新加载更新的自定义 UDF 函数?