如何返回ObjectInspector引用的Object

时间:2012-10-11 18:55:13

标签: java hive user-defined-functions

我正在编写自定义Hive UDF,以根据属性文件中定义的值解析Map中的键/值对。格式为validate(Map< String,String>,String)。目的是让第一个参数成为要评估的Map,第二个参数包含属性文件。

我遇到的问题是,GenericUDF类似乎期望这两个值对于查询都是动态的,因为initialize()函数将参数转换为ObjectInspectors,从外观上看不可能选项返回他们正在检查的对象。

我希望initialize函数加载属性文件,而evaluate函数返回pass / fail。这个代码几乎不足以涵盖我尝试过的所有内容,但希望它能让那些知道他们对这个问题有所了解的人:

public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentException {
  mapOI = (MapObjectInspector) arguments[0];
  StringObjectInspector stringOI = (StringObjectInspector) arguments[1];

  try {
    // Begin Debug
    System.out.println(stringOI.getPrimitiveJavaObject(((DeferredObject) arguments[1]).get()));
    // End Debug

    loadProperties(stringOI.getPrimitiveJavaObject(((DeferredObject) arguments[1]).get()));
  }
  catch (HiveException exception) {
    throw new UDFArgumentTypeException(1, "Failed to cast properties file path for evaluation by loadProperties... What did you do?");
  }

1 个答案:

答案 0 :(得分:2)

initialize方法只调用一次,因此参数只能被视为描述evaluate方法期望接收的输入类型的元数据。因此,实际上可以看到输入值的唯一位置是evaluate方法,该方法可能多次调用,通常每行一次。您应该只使用initialize函数来验证类型而不是实际值。也就是说,在您的情况下,检查输入是否为类型为map的类型为string的基本类别元素。应在评估方法中对实际值进行验证。