2014-11-28 5 views
1

Tajo에서 특히 Python으로 UDF를 작성할 수 있는지 궁금합니다. 나의 유스 케이스는 어떤 ID (브라우저 ID)로 로그 레코드를 그룹화 한 다음 동일한 그룹의 레코드를 타임 스탬프로 정렬하고 마침내 UDF를 사용하여 각 그룹의 정렬 된 레코드로 이동하려는 ETL을위한 것이다.Tajo에서 UDF를 작성하는 방법

답변

1

나는 Tajo PMC 회원입니다. Tajo에 관심을 가져 주셔서 감사합니다.

현재 Tajo는 아직 Python UDF를 지원하지 않습니다. 그러나 Tajo는 각 단일 함수 서명에 대해 여러 개의 UDF 함수 구현을 갖도록 설계되었습니다. Python 함수 UDF 기능을 Tajo에 쉽게 추가 할 수 있습니다.

이제 사용자 정의 기능을 위해 Java 기반 Java를 사용해야합니다. 사용자 정의 UDF를 구현하는 두 가지 f}이 있습니다. 물론, 두 방법 모두 매우 쉽습니다.

첫 번째 방법은 기존 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())); 
    } 
} 

또 다른 방법은 새로운 함수 인터페이스를 사용하는 것입니다. 이 f}으로 각 UDF에 대한 정적 메소드 만 구현하면됩니다. 함수의 각 정적 메소드는 하나 이상의 Java 원시 유형 또는 Java 오브젝트 유형 매개 변수를 가질 수 있습니다.

각 매개 변수가 프리미티브 또는 개체 유형인지 여부에 따라 각 매개 변수는 암시 적으로 다른 효과를가집니다. 기본 유형 인수가 NULL 값을 허용하지 않습니다. 이 경우 매개 변수에 NULL 값이 있으면이 함수는 실제로 함수를 호출하지 않고 NULL 값을 자동으로 반환합니다. SQL의 3 값 논리를 사용하면 이와 같은 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 값을 처리해야하십시오 Tajo 클러스터에 자신의 UDF를 추가하려면

@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); 
} 

, 당신은 당신의 자신의 기능 클래스를 포함하는 jar 파일을 확인해야합니다. 현재 Tajo는 사용자가 런타임에 사용자 정의 jar를 추가하는 것을 허용하지 않습니다. 따라서 사용자 정의 jar를 $ {TAJO_HOME}/lib에 복사 한 다음 Tajo 클러스터를 재시작해야합니다.

또한 Tajo는 사용자가 런타임에 함수를 곧 추가 할 수 있도록 CREATE FUNCTION 기능을 지원합니다.

관련 문제