Улей доступа к предыдущему значению строки

У меня есть та же проблема, упомянутая здесь

Однако проблема в базе данных 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).

Какой обходной путь возможен в этом случае

1 ответ

Вам придется написать 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.

Рекурсивный запрос не поддерживается, потому что он вводит несколько этапов с массовым вводом-выводом, что является чем-то, что не подходит для основного механизма выполнения и хранения. Фактически, Hive строго запрещает рекурсивные ссылки для CTE и представлений. Следовательно, вы получили ошибку.

Другие вопросы по тегам