[英]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.