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