У меня есть UDF, написанный на Java, который распространяет последнее ненулевое значение через строки, упорядоченные по row_number, только если фактическое значение равно 9. Эти значения могут различать разные компоненты.
Например:
Row number | Component | Value
---------------------------------
1 1 3
2 1 4
3 1 NULL
4 1 NULL
5 2 3
6 2 9
7 1 9
8 1 5
9 2 6
10 1 9
Должно привести к:
Row number | Component | Value
---------------------------------
1 1 3
2 1 4
3 1 NULL
4 1 NULL
5 2 3
6 2 3
7 1 4
8 1 5
9 2 6
10 1 5
Чтобы сохранить последнее ненулевое значение, я установил глобальную переменную в UDF, которая отвечала бы за распределение последнего зарегистрированного значения:
HashMap<String, String> hmapS = new HashMap<String, String>();
Сначала я упорядочиваю строки, затем использую UDF:
select my_udf(component,value) as propagated_value
from(
select row_number,component, value
order by row_number
limit 99999999 -- Need this so that impala orders rows
)a
Проблема в том, что hmapS не соблюдает порядок.
В приведенном выше примере иногда можно получить:
Row number | Component | Value
---------------------------------
1 1 3
2 1 4
3 1 NULL
4 1 NULL
5 2 3
6 2 6
7 1 3
8 1 5
9 2 6
10 1 3
Похоже на условие гонки , и что java udf на самом деле не соответствует 'order by row_number'.
Как я могу заставить его уважать это?
Это будет код UDF, если он поможет:
@UDFType(deterministic = true, stateful = false)
public class PropVarUT
extends UDF
{
HashMap<String, String> hmapS = new HashMap<String, String>();
// Only propagate when value is 9
public String evaluate(String component, String value)
{
String output = null;
if(value !=null)
{
if (value.equals("9"))
{
output = hmapS.get(ut);
}
else
{
hmapS.put(component, value);
output = value;
}
}
return output;
}
}