[英]Hive access previous row value
我在这里提到了同样的问题
但是,问题出在 Hive 数据库上。 当我在桌子上尝试解决方案时,它看起来像
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
我收到错误
FAILED: SemanticException Recursive cte cteCalculation detected (cycle: ctecalculation -> cteCalculation).
在这种情况下可能的解决方法是什么
您必须为此编写一个 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;
}
}
}
Hive 公用表表达式 (CTE) 用作查询级别临时表(一种语法糖),可在整个 SQL 中访问。
不支持递归查询,因为它引入了大量 I/O 的多个阶段,这是底层执行和存储引擎不擅长的。 事实上,Hive 严格禁止对 CTE 和视图进行递归引用。 因此你得到了错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.