【问题标题】:Hive Query with UDF使用 UDF 进行 Hive 查询
【发布时间】:2012-10-17 23:37:16
【问题描述】:

我在 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 不支持 IN 或 where 子句中的 select 查询。

我能做什么?

我可以这样做吗:

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

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

【问题讨论】:

    标签: encryption hadoop hive


    【解决方案1】:

    终于用右外连接 as

    搞定了
    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);
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        是这样的:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-09-23
          • 2017-01-14
          • 2016-01-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多