2014-11-28 2 views
1

Мне интересно, могу ли я написать UDF в Tajo, особенно в Python. Мой вариант использования - для ETL, где я хочу группировать записи журналов с помощью идентификатора (идентификатор браузера), затем сортировать записи в одной группе по метке времени, а затем, наконец, использовать мой UDF для перебора отсортированных записей в каждой группе.Как написать UDF в Tajo

ответ

1

Я член PMC Тахо. Благодарим вас за интерес к Тахо.

В настоящее время Tajo еще не поддерживает Python UDF. Но, Tajo был разработан, чтобы иметь несколько реализаций функций UDF для каждой отдельной сигнатуры функции. Функция UDF функции Python может быть легко добавлена ​​в Tajo.

Теперь вы должны использовать Java-based для своих собственных функций. Существует два способа реализации ваших пользовательских UDF. Конечно, оба способа очень просты.

Первый способ - использовать устаревший интерфейс Tajo UDF. Таким образом, каждая реализация функции должна быть классом, который наследует класс GeneralFunction. eval() - это тело каждой реализации UDF. Примером может служить следующее:

@Description(
    functionName = "pow", 
    description = "x raised to the power of y", 
    example = "> SELECT pow(9.0, 3.0)\n" 
      + "729", 
    returnType = FLOAT8, 
    paramTypes = { 
     @ParamTypes(paramTypes = {FLOAT8, FLOAT8}) 
    } 
) 
public class Pow extends GeneralFunction { 
    public Pow() { 
    super(new Column[] { 
     new Column("x", FLOAT8), 
     new Column("y", FLOAT8) 
    }); 
    } 

    @Override 
    public Datum eval(Tuple params) { 
    Datum value1Datum = params.get(0); 
    Datum value2Datum = params.get(1); 
    if(value1Datum instanceof NullDatum || value2Datum instanceof NullDatum) { 
     return NullDatum.get(); 
    } 

    return DatumFactory.createFloat8(Math.pow(value1Datum.asFloat8(), value2Datum.asFloat8())); 
    } 
} 

Другим способом является использование нового функционального интерфейса. Таким образом, вам нужно просто реализовать статический метод для каждого UDF. Каждый статический метод для функции может иметь один или несколько параметров типа примитива Java или типа Java.

В зависимости от того, является ли каждый параметр примитивным или типа объекта, каждый параметр имеет неявно различный эффект. Аргумент примитивного типа не допускает значения NULL. В этом случае, если параметр принимает значение NULL, эта функция автоматически вернет значение NULL без фактического вызова функции. С трехзначной логикой SQL, обработка NULL, подобная этой, очень распространена в функции SQL. Итак, в основном, Tajo предоставляет эту функцию.

Пример функции с примитивными параметрами:

@ScalarFunction(name = "pow", returnType = FLOAT8, paramTypes = {FLOAT8, FLOAT8}) 
public static double pow(double x, double y) { 
    return Math.pow(x, y); 
} 

В противоположность этому, параметр Тип объекта позволяет NULL значения. В этом случае каждая функция должна явно обрабатывать NULL значения следующим образом:

@ScalarFunction(name = "pow", returnType = FLOAT8, paramTypes = {FLOAT8, FLOAT8}) 
public static Double pow(Double x, Double y) { 
    if (x == null || y == null) { 
    return null; 
    } 
    return Math.pow(x, y); 
} 

Для того, чтобы добавить свои собственные пользовательские функции к кластеру Тахо, вам нужно создать файл банка, в том числе собственных функциональных классов. В настоящее время Tajo не позволяет пользователям добавлять пользовательские банки во время выполнения. Итак, вы должны скопировать пользовательские банки в $ {TAJO_HOME}/lib, а затем перезапустить кластер Tajo.

Кроме того, Tajo будет поддерживать функцию CREATE FUNCTION, чтобы пользователи могли быстро добавлять функции во время выполнения.

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