我编写了一个 Hive UDF,如下所示:
public class DemoUDF extends GenericUDF{
private ObjectMapper mapper = new ObjectMapper();
... initialize() method...
public Object evaluate(DeferredObject[] deferredObjects) throws HiveException{
... ...
ActionVO vo = mapper.readValue(target_str, ActionVO.class);
... ...
}
}
当我将此函数添加到配置单元中,并通过一些查询执行它时,存在以下异常:
引起:java.lang.NullPointerException 在 com.fasterxml.jackson.databind.util.LRUMap.get(LRUMap.java:68) 在 com.fasterxml.jackson.databind.type.TypeFactory._fromClass(TypeFactory.java:1255) 在 com.fasterxml.jackson.databind.type.TypeFactory._fromAny(TypeFactory.java:1194) 在 com.fasterxml.jackson.databind.type.TypeFactory.constructType(TypeFactory.java:608)
当我将 ObjectMapper 声明更改为下面时,它工作正常!
private static final ObjectMapper mapper = new ObjectMapper();
那为什么呢?有什么效果?
我认为一旦你将一个变量设置为静态,那么它的类级别的东西就会被存储,并且只会存储它的一个副本。 JVM 在类加载期间分配静态变量。对于非静态实例,将根据类实例创建多个副本,因此需要更多内存。 静态变量由类的所有对象共享,并且具有单个实例,而非静态变量对于每个对象来说都是唯一的,并且对于不同的对象具有不同的值。