본문 바로가기

Data&Processing

Hive UDF functionality check by scala program

Hive UDF개발 후 Function 이 잘 도는지 확인하기 위해서 test 개발시,

UDF가 GenericUDF를 상속받았을 경우에는 Initialize와 evalute에서 type이 정해져 있어서 맞춰주어야함


initialize 의 경우는 ObjectInspector

evalute 의 경우는 DeferredObject


Hive내부에서 위와 같은 type으로 UDF에 넘기는듯함

Java로 개발하면 예제가 많기는 한데 scala는 예제가 별로 없어서 변환해봄

Test한 UDF는 Array[String]을 받아서 결과를 Return해주는 함수임(Return Type은 별로 신경안써도 괜찮은듯)


import org.apache.hadoop.hive.ql.udf.generic.GenericUDF.{DeferredJavaObject, DeferredObject}

import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory

import org.apache.hadoop.hive.serde2.objectinspector.{ObjectInspector, ObjectInspectorFactory}


object test01 {


  var a = Array(1,2,3,1,1,2,2,2)

  var c = Array("a1","a1","b2","c3","b2","a1")


  var def1 = new DeferredJavaObject(c)


  val obj1 : ObjectInspector = PrimitiveObjectInspectorFactory.javaStringObjectInspector

  var obj0 : ObjectInspector = ObjectInspectorFactory.getStandardListObjectInspector(obj1)


  var def0 : DeferredObject = def1.asInstanceOf[DeferredObject]


  def main(args: Array[String]) {

    println(a.length )


    val b = new CollectMap()

    b.initialize(Array(obj0))

    println(b.evaluate(Array(def0)))


  }


}