如何返回由 ObjectInspector 引用的对象

Posted

技术标签:

【中文标题】如何返回由 ObjectInspector 引用的对象【英文标题】:How to return an Object referenced by an ObjectInspector 【发布时间】:2012-10-11 18:55:13 【问题描述】:

我正在编写一个自定义 Hive UDF,以根据属性文件中定义的值解析 Map 中的键/值对。格式为 validate(Map, 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?");
  

【问题讨论】:

你想返回什么?stringOI还是mapOI? 抱歉,代码不够详细,但我希望将 stringOI 引用的字符串传递给另一个函数。在我开发的这一点上,我试图将其转换为评估函数用于检索 Ojbect 的 DeferredObject,并捕获 HiveException 并重新抛出为 UDFArgumentException 以吃掉编译错误。编辑传入。 【参考方案1】:

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

【讨论】:

谢谢格雷格。在查看了像 substr() 这样的 UDF 的实现之后,我得出了类似的结论。出于我的解决方案的目的,我正在尝试通过在加载属性文件后设置一个标志来防止在评估期间多次加载。

以上是关于如何返回由 ObjectInspector 引用的对象的主要内容,如果未能解决你的问题,请参考以下文章

我们如何在 Hive 中为自定义 Writable 类型编写自定义 ObjectInspector?

Hive中的ObjectInspector设计

在Python中如何理解返回值?

如何在Qt Designer中限制布局的增长(大小)?

delphi TComponent类

由 ref 返回的值类型变量在哪里存在?堆栈还是堆?