hadoop - Hive UDF 执行

标签 hadoop hive

我编写了一个 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?即,如果我选择 10,000 行,则评估方法是否会运行 10,000 次?

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

有什么办法我可以执行以下操作之一:

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

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

提前致谢

最佳答案

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

如果每个 JVM 一次,只需将其放入类中的静态 block 中,如下所示:

static {
    configure();
}

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

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

关于hadoop - Hive UDF 执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12866610/

相关文章:

hadoop - 对HDFS、HBase和Hive的一些疑惑

python - 如何使用python处理hdfs中的文件

java - 在配置单元中创建表异常?

hadoop - 在配置单元中执行查询时显示 Tez 顶点错误

mysql - 将 Hive 表转换为 MySQL

hadoop - 如何显式定义数据节点以在 HDFS 中存储特定的给定文件?

hadoop - 多输出hadoop

hadoop - hdfs 和 hive 有什么关系?

hadoop - 大数据仓库还需要星型模式吗?

hadoop - 如何在配置单元中将 mapreduce 任务的数量设置为 1