1

我在 HDFS csv 中有一些加密数据,我已经为其创建了一个 Hive 表,并且我想运行一个 Hive 查询,该查询首先加密查询参数,然后进行查找。我有一个按如下方式进行加密的 UDF:

public class ParamEncrypt extends UDF {

public Text evaluate(String name) throws Exception {

    String result = new String();

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

    result = ParamData.encrypt(name);

    return new Text(result);
}
}

然后我将 Hive 查询运行为:

select * from cc_details where first_name = encrypt('Ann');

问题是,它在表中的每条记录上运行 encrypt('Ann')。我希望它进行一次加密,然后进行匹配。我试过了:

select * from cc_details where first_name in (select encrypt('Ann') from cc_details limit 1);

但是 Hive 在 where 子句中不支持IN或 select 查询。

我能做些什么?

我可以做类似的事情:

select encrypt('Ann') as ann from cc_details where first_name = ann;

这也不起作用,因为查询解析器抛出一个错误,说ann不是已知列

4

3 回答 3

1

最后用右外连接得到它

select * from cc_details ssn_tbl
right outer join ( select encrypt('850-37-8230','ssn') as ssn 
    from cc_details limit 1) ssn_tmp
on (ssn_tbl.ssn = ssn_tmp.ssn);
于 2012-10-18T03:21:57.960 回答
0

另一种实现方式(实际上也是我最终采用的方式)是缓存加密结果。这种方式实际上更快,因为通过连接,您可以获得一组单独的 map-reduce 作业,这会减慢整体执行时间。

就像这样:

private static String result = null;

public Text evaluate(String data) {
    if (result ==  null) {
        result = Data.encrypt(data);
    }
    return new Text(result);
}
于 2012-10-21T00:08:44.543 回答
0

我认为您正在寻找的是@UDFType(deterministic = true)您的 UDF 上的注释。它绝对可以在通用 UDF 上使用,您可以检查它是否可用于您创建的常规 UDF。如果没有,只需将您的 UDF 转换为 GenericUDF。您可以在我不久前写的这篇博文中了解它。

于 2012-10-19T04:49:30.140 回答