Как глобальные переменные UDF, написанные на Java, действуют в Cloudera Impala? - PullRequest
1 голос
/ 08 апреля 2019

У меня есть 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;
  }

}
...