我编写了一个hive udf,它使用内部api进行解密,如下所示:
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?i、 如果我选择10000行,evaluate方法是否运行10000次?
我的直觉告诉我是的。如果是这样,那么还有第二个问题:
我有没有办法做到以下一点:
a) 在查询第一次启动时运行configure(),然后共享上下文对象
b) udf没有返回解密的字符串,而是将加密的字符串聚合到某个集合中,然后我对集合进行批量解密?
提前谢谢
1条答案
按热度按时间7gcisfzg1#
是
configure()
需要为每个jvm调用一次,或者为udf类的每个示例调用一次的东西?如果每个jvm一次,只需将其放入类中的静态块中,如下所示:
如果每个示例一次,则将其放入构造函数中: