Hive访问上一行值

时间:2015-12-05 04:42:50

标签: sql hadoop hive

我提到了同样的问题 here

然而,问题出在Hive数据库上。当我在我的桌子上尝试看起来像

的解决方案时
devices_fk

我收到错误

Id   Date             Column1    Column2
1    01/01/2011       5          5 => Same as Column1
2    02/01/2011       2          18 => (1 + (value of Column2 from the previous row)) * (1 + (Value of Column1 from the current row)) i.e. (1+5)*(1+2)
3    03/01/2011       3          76 => (1+18)*(1+3) = 19*4

在这种情况下可能的解决方法是什么

2 个答案:

答案 0 :(得分:2)

你必须为此编写一个UDF 下面你可以看到一个非常(!!)简化的UDF,你需要它 我们的想法是将之前执行的值存储在UDF内的变量中,每次返回(stored_value+1)*(current_value+1),然后将其存储到下一行。
您需要处理第一个值,因此有一个特殊情况 此外,您必须将订购的数据传递给函数,因为它只是一行一行地执行您需要的而不考虑任何订单。

你必须添加你的jar并创建一个函数,我们称之为cum_mul

SQL将是:

select id,date,column1,cum_mul(column1) as column2
from
(select id,date,column1 from myTable order by id) a  

UDF的代码:

import org.apache.hadoop.hive.ql.exec.UDF;

public class cum_mul extends UDF  {

    private int prevValue;
    private boolean first=true;

    public int evaluate(int value) {
        if (first) {
            this.prevValue = value;
            first = false;
            return value; 
        }
        else {
            this.prevValue = (this.prevValue+1)*(value+1);
            return this.prevValue;      
        }
      }
}

答案 1 :(得分:0)

Hive公共表表达式(CTE)用作查询级别的临时表(语法糖),可在整个SQL中访问。

不支持递归查询,因为它引入了具有大量I / O的多个阶段,这是基础执行和存储引擎不擅长的。实际上,Hive严格禁止对CTE和视图进行递归引用。因此,您得到了错误。