簡體   English   中英

Hive 訪問上一行值

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM