我提到了同样的问题 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
在这种情况下可能的解决方法是什么
答案 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和视图进行递归引用。因此,您得到了错误。