2015-04-06 3 views
1

Я создал функцию java, которая создает автоматическое инкрементное значение, и я создал UUF для улья на основе этой функции, он отлично работает в улье. Я создал Impala UDF на основе этой функции, и он возвращает «null» вместо автоматического инкрементного целого.Autoincrement UDF работает в улье, но возвращает null в Impala

Вот код Java UDF:

import org.apache.hadoop.hive.ql.exec.UDF; 
import org.apache.hadoop.hive.ql.udf.UDFType; 

@UDFType(stateful = true) 
public class AutoIncrementUDF extends UDF { 

    int ctr; 

    public int evaluate() { 
     ctr++; 
     return ctr; 
    } 
} 

Создание улей UDF:

create function autoincr as 'AutoIncrementUDF'; 

Создание Impala UDF:

create function autoincr() returns int LOCATION '/user/acombs/AutoIncrementUDF.jar' symbol='AutoIncrementUDF'; 

Используя его в улей и Impala:

select autoincr() as testkey, * from mapfund 

Любая помощь очень ценится! Спасибо, Anna

ответ

2

К сожалению Impala не поддерживает @UDFType аннотацию или понятие с состоянием улей UDF. Мы добавим примечание в нашу документацию, чтобы сделать это ограничение известным.

Однако, если вы пытаетесь вернуть номер строки, вы можете использовать функции аналитического окна, такие как ROW_NUMBER().

Например,

> select ROW_NUMBER() over (order by int_col) as testkey, int_col, float_col from alltypestiny; 
+---------+---------+-------------------+ 
| testkey | int_col | float_col   | 
+---------+---------+-------------------+ 
| 1  | 0  | 0     | 
| 2  | 0  | 0     | 
| 3  | 0  | 0     | 
| 4  | 0  | 0     | 
| 5  | 1  | 1.100000023841858 | 
| 6  | 1  | 1.100000023841858 | 
| 7  | 1  | 1.100000023841858 | 
| 8  | 1  | 1.100000023841858 | 
+---------+---------+-------------------+ 
Fetched 8 row(s) in 0.12s 

См Impala Analytic Functions для более подробной информации.

Смежные вопросы