配置单元udf执行

pkln4tw6  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(309)

我编写了一个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没有返回解密的字符串,而是将加密的字符串聚合到某个集合中,然后我对集合进行批量解密?
提前谢谢

7gcisfzg

7gcisfzg1#

configure() 需要为每个jvm调用一次,或者为udf类的每个示例调用一次的东西?
如果每个jvm一次,只需将其放入类中的静态块中,如下所示:

static {
    configure();
}

如果每个示例一次,则将其放入构造函数中:

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

相关问题