복붙노트

[HADOOP] 하이브 액세스 이전 행 값

HADOOP

하이브 액세스 이전 행 값

저도 같은 문제가 언급 한 이리

그러나 문제는 하이브 데이터베이스에 있습니다. 나는처럼 보이는 내 테이블에 솔루션을하려고하면

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).

이 경우 가능한 해결 방법은 무엇입니까

해결법

  1. ==============================

    1.당신은 이것에 대한 UDF를 작성해야합니다. 당신은 당신이 필요로하는 것에 대해 매우 (!) 단순화 된 UDF를 볼 수 있습니다. 아이디어는 UDF 내부 변수의 이전 실행 때마다 회수 (stored_value + 1) * (CURRENT_VALUE + 1)의 값을 저장 한 후 다음 라인을 저장하는 것이다. 당신이 얻을 수있는 첫 번째 값을 돌볼 필요가 있기 (위해) 때문에, 특별한 경우는 거기에있다. 또한, 당신은 단순히 라인으로 라인을 가고 당신이 어떤 순서를 고려하지 않고 필요한 것을 수행으로 함수에 주문 데이터를 전달해야합니다.

    당신은 이것에 대한 UDF를 작성해야합니다. 당신은 당신이 필요로하는 것에 대해 매우 (!) 단순화 된 UDF를 볼 수 있습니다. 아이디어는 UDF 내부 변수의 이전 실행 때마다 회수 (stored_value + 1) * (CURRENT_VALUE + 1)의 값을 저장 한 후 다음 라인을 저장하는 것이다. 당신이 얻을 수있는 첫 번째 값을 돌볼 필요가 있기 (위해) 때문에, 특별한 경우는 거기에있다. 또한, 당신은 단순히 라인으로 라인을 가고 당신이 어떤 순서를 고려하지 않고 필요한 것을 수행으로 함수에 주문 데이터를 전달해야합니다.

    당신은 당신의 항아리를 추가하고 함수를 작성해야 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;      
            }
          }
    }
    
  2. from https://stackoverflow.com/questions/34101365/hive-access-previous-row-value by cc-by-sa and MIT license