我有一个用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;
}
}
暂无答案!
目前还没有任何答案,快来回答吧!