Java 如何返回ObjectInspector引用的对象

Java 如何返回ObjectInspector引用的对象,java,hive,user-defined-functions,Java,Hive,User Defined Functions,我正在编写一个自定义配置单元UDF,以根据属性文件中定义的值解析映射中的键/值对。正在验证的格式(映射、字符串)。其目的是让第一个参数是要计算的映射,第二个参数包含属性文件 我遇到的问题是,GenericUDF类似乎期望这两个值对于查询都是动态的,因为initialize()函数将参数转换为ObjectInspector,从外观上看,它不可能返回它们正在检查的对象 我希望initialize函数加载属性文件,evaluate函数返回pass/fail。这几乎不足以涵盖我尝试过的所有代码,但希望它

我正在编写一个自定义配置单元UDF,以根据属性文件中定义的值解析映射中的键/值对。正在验证的格式(映射、字符串)。其目的是让第一个参数是要计算的映射,第二个参数包含属性文件

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

我希望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?");
  }

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

您希望返回什么?stringOI或mapOI?抱歉,代码不够详细,但我希望stringOI引用的字符串传递给另一个函数。在开发的这一点上,我试图将其转换为evaluate函数用于检索Ojbect的DeferreObject,并捕获HiveException并将其作为UDFArgumentException重新抛出以消除编译错误。谢谢你,格雷格。在研究了substr()等UDF的实现之后,我得出了类似的结论。出于我的解决方案的目的,我正在尝试一些肮脏的东西,方法是在加载属性文件后设置一个标志,以防止在评估期间多次加载。