如何返回对象检查器引用的对象



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

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

我希望初始化函数加载属性文件,评估函数返回通过/失败。 这还不足以涵盖我尝试过的所有代码,但希望它能让知道自己在做什么的人对这个问题有一个好主意:

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

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

相关内容

最新更新