用java编写的UDF的全局变量如何在cloudera impala中起作用?

bfnvny8b  于 2021-05-29  发布在  Hadoop
关注(0)|答案(0)|浏览(266)

我有一个用java编写的udf,它只在实际值为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>();

首先对行进行排序,然后使用自定义项:

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

问题是“hmap”不遵守订单。
在上面的例子中,我有时会得到:

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

它看起来像一个竞争条件,而且javaudf实际上并不尊重“orderbyrow\u 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;
  }

}

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题