带udf的配置单元查询

rkkpypqq  于 2021-06-03  发布在  Hadoop
关注(0)|答案(3)|浏览(303)

我在hdfs csv中有一些加密的数据,我已经为这些数据创建了一个配置单元表,我想运行一个配置单元查询,首先对查询参数进行加密,然后进行查找。我有一个自定义项,它按如下方式进行加密:

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);
}
}

然后运行配置单元查询:

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不是已知列

4bbkushb

4bbkushb1#

另一种方法是缓存加密的结果。这种方式实际上更快,因为通过join,您可以得到一组单独的map reduce作业,这会减慢总体执行时间。
是这样的:

private static String result = null;

public Text evaluate(String data) {
    if (result ==  null) {
        result = Data.encrypt(data);
    }
    return new Text(result);
}
2j4z5cfb

2j4z5cfb2#

最后得到了一个右外连接

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);
4sup72z8

4sup72z83#

我想你要找的是注解 @UDFType(deterministic = true) 在你的自定义项上。它肯定在通用自定义项中可用,您可以检查它是否适用于您创建的常规自定义项。如果没有,只需将自定义项转换为genericudf。你可以在我不久前写的这篇博文上看到。

相关问题