[Hive 6] Hive 사용자 정의 함수 (UDF)

1. 하 이브 UDF 란 무엇 인가
하 이브 는 Hadoop 의 MapReduce 를 기반 으로 HQL 조 회 를 제공 하 는 데이터 창고 다.Hive 는 매우 개방 적 인 시스템 으로 많은 내용 이 사용자 의 맞 춤 형 제작 을 지원 합 니 다.
  • 파일 형식: 텍스트 파일, 시퀀스 파일
  • 메모리 의 데이터 형식: Java Integer / String, Hadoop IntWritable / Text
  • 사용자 가 제공 하 는 map / reduce 스 크 립 트: 어떤 언어 든 stdin / stdout 으로 데 이 터 를 전송 합 니 다
  • 사용자 정의 함수: Substr, Trim
  • 사용자 정의 집합 함수: Sum, Average
  • UDF 는 1 진 1 출 만 가능 하 며, 1 진 1 출 이 필요 하 다 면 UDAF
  • 가 필요 하 다.
    2. UDF 사용법
  • UDF 함 수 는 selection 구문 에 직접 적용 하여 조회 구 조 를 포맷 처리 한 후 내용 을 출력 할 수 있 습 니 다
  • 사용자 정의 UDF 는 org. apache. hadop. hive. ql. UDF
  • 를 계승 해 야 합 니 다.
  • 사용자 정의 UDF 는 UDF 의 evaluate 방법
  • 이 필요 합 니 다.
  • UDF 의 evaluate 방법 은 리 셋 을 지원 합 니 다. 즉, 여러 개의 evaluate 방법 을 정의 할 수 있 습 니 다. 이 방법 은 매개 변수 목록 이 사용자 가 UDF 함 수 를 호출 할 때 제공 하 는 방법 매개 변수 와 일치 하면 됩 니 다
  • 3. 사용자 정의 함수 UDF 구현 예시
     
     
    package org.apache.hadoop.hive.ql.udf;
    
    import org.apache.hadoop.hive.ql.exec.UDF;
    import org.apache.hadoop.hive.serde2.io.DoubleWritable;
    import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;
    
    public abstract class UDFMath extends UDF {
      private final DoubleWritable doubleWritable = new DoubleWritable();
    
      public UDFMath() {
      }
    
      /**
       * For subclass to implement.
       */
      public abstract DoubleWritable evaluate(DoubleWritable a);
    
      /**
       * Convert HiveDecimal to a double and call evaluate() on it.
       */
      public final DoubleWritable evaluate(HiveDecimalWritable writable) {
        if (writable == null) {
          return null;
        }
    
        double d = writable.getHiveDecimal().bigDecimalValue().doubleValue();
        doubleWritable.set(d);
        return evaluate(doubleWritable);
      }
    
    }

     
     
     
    package org.apache.hadoop.hive.ql.udf;
    
    import org.apache.hadoop.hive.ql.exec.Description;
    import org.apache.hadoop.hive.ql.exec.UDF;
    import org.apache.hadoop.hive.ql.exec.vector.VectorizedExpressions;
    import org.apache.hadoop.hive.ql.exec.vector.expressions.gen.FuncSinDoubleToDouble;
    import org.apache.hadoop.hive.ql.exec.vector.expressions.gen.FuncSinLongToDouble;
    import org.apache.hadoop.hive.serde2.io.DoubleWritable;
    import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;
    
    /**
     * UDFSin.
     *
     */
    @Description(name = "sin",
        value = "_FUNC_(x) - returns the sine of x (x is in radians)",
        extended = "Example:
    " + " > SELECT _FUNC_(0) FROM src LIMIT 1;
    " + " 0") @VectorizedExpressions({FuncSinLongToDouble.class, FuncSinDoubleToDouble.class}) public class UDFSin extends UDFMath { private final DoubleWritable result = new DoubleWritable(); public UDFSin() { } /** * Take Sine of a. */ public DoubleWritable evaluate(DoubleWritable a) { if (a == null) { return null; } else { result.set(Math.sin(a.get())); return result; } } }

     위 에는 정 현 을 구 하 는 UDF 함수 가 사용자 정의 되 어 있 습 니 다.
     
    4. 사용자 정의 함수 UDF 사용 방법
  • 프로그램 을 대상 기계 에 포장 하여 hive 클 라 이언 트 에 들 어가 jar 패키지
  • 를 추가 합 니 다.
    hive>add  jar /user/hadoop/udf.math.sin.jar;

     
  • 임시 함수 만 들 기:
  • hive>CREATE TEMPORARY FUNCTION math.sin AS 'org.apache.hadoop.hive.ql.udf.UDFSin';

     
  • 임시 함수 조회
  • SELECT math.sin(3.14) FROM word;

     
  •   임시 함수 삭제:
  • hive> DROP TEMPORARY FUNCTION math.sin;

     
    5.  UDF 를 하 이브 로 영구 등록
  • 다음 파일 찾기: ql / src / java / org / apache / hadop / hiv / ql / exec / Function Registry. java
  • 새로운 등록 함수 my func
  • 추가
    org.apache.hadoop.hive.ql.udf.UDFMath
    org.apache.hadoop.hive.ql.udf.UDFSin

     
    등록 함수 추가 문
     
    registerFunction("udf_math_sina", UDFSin.class)

     
     
     
     
     
     
     

    좋은 웹페이지 즐겨찾기