如何在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的主要内容,如果未能解决你的问题,请参考以下文章
自动增量 UDF 在 hive 中工作,但在 Impala 中返回 null
用java编写的hive udf、udaf、udtfs如何在eclipse之类的ide中调试?