Улей доступа к предыдущему значению строки
У меня есть та же проблема, упомянутая здесь
Однако проблема в базе данных 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 и представлений. Следовательно, вы получили ошибку.