0

我正在编写一个自定义 Hive UDF 来根据属性文件中定义的值解析 Map 中的键/值对。格式为 validate(Map<String, String>, String)。目的是让第一个参数是要评估的 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?");
  }
4

1 回答 1

2

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

于 2012-10-12T19:39:18.767 回答