我在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不是已知列
3条答案
按热度按时间4bbkushb1#
另一种方法是缓存加密的结果。这种方式实际上更快,因为通过join,您可以得到一组单独的map reduce作业,这会减慢总体执行时间。
是这样的:
2j4z5cfb2#
最后得到了一个右外连接
4sup72z83#
我想你要找的是注解
@UDFType(deterministic = true)
在你的自定义项上。它肯定在通用自定义项中可用,您可以检查它是否适用于您创建的常规自定义项。如果没有,只需将自定义项转换为genericudf。你可以在我不久前写的这篇博文上看到。