2012-10-12 105 views
1

我写了一个蜂巢UDF使用一个内部的API如下,做解密:蜂巢UDF执行

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

其中配置( )创建了一个相当昂贵的上下文对象。

我的问题是:Hive是否为查询返回的每一行执行一次UDF?即如果我选择10,000行,评估方法是否运行10,000次?

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

有什么办法,我可以做下列之一:

一)运行配置()一旦第一次启动查询时,然后共享上下文对象

b)代替UDF返回一个解密的字符串,它将加密的字符串聚合成一些Set,然后我对该集合进行批量解密?

在此先感谢

回答

1

configure()一些需要被调用一次每个JVM,或每UDF类的实例一次?

如果每一次JVM,只是把它放在一个静态块在类,像这样:

static { 
    configure(); 
} 

如果每一次实例,把它在构造函数中:

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

是的。在我发布问题后约两分钟,我就可以做**静态{} **。 –