Hive UDF执行

时间:2012-10-12 20:27:16

标签: hadoop hive

我编写了一个使用内部API进行解密的Hive UDF,如下所示:

public Text evaluate(String customer) {
    String result = new String();

    if (customer == null) { return null; }

    try {
        result = com.voltage.data.access.Data.decrypt(customer.toString(), "name");
    } catch (Exception e) {
        return new Text(e.getMessage());
    }

    return new Text(result);
}

,Data.decrypt执行:

public static String decrypt(String data, String type) throws Exception {
    configure();
    String FORMAT = new String();
    if (type.equals("ccn")) {
        FORMAT = "CC";
    } else if (type.equals("ssn")) {
        FORMAT = "SSN";
    }   else if (type.equals("name")) {
        FORMAT = "AlphaNumeric";
    }

    return library.FPEAccess(identity, LibraryContext.getFPE_FORMAT_CUSTOM(),String.format("formatName=%s", FORMAT),authMethod, authInfo, data);
}

其中 configure()会创建一个非常昂贵的上下文对象。

我的问题是:Hive是否为查询返回的每一行执行一次UDF?即如果我选择了10,000行,那么evaluate方法会运行10,000次吗?

我的直觉告诉我。如果是这样,那么这是第二个问题:

我有什么办法可以做到以下其中一项:

a)在查询首次启动时运行 configure(),然后共享上下文对象

b)而不是UDF返回一个解密的字符串,它将加密的字符串聚合到某个Set中,然后我对该集合进行批量解密?

提前致谢

1 个答案:

答案 0 :(得分:2)

每个JVM需要调用一次configure(),或者每个UDF类实例需要调用一次吗?

如果每个JVM一次,只需将它放在类中的静态块中,如下所示:

static {
    configure();
}

如果每个实例一次,请将其放在构造函数中:

public [class name]() {
    super();
    configure();
}