配置单元UDF从不使用外部查询的分布式缓存中获取值



我们用Java编写了一个Hive UDF,用于从添加到分布式缓存中的文件中获取值,该文件可以从选择查询中完美地工作,如:

查询1。

select country_key, MyFunction(country_key,"/data/MyData.txt") as capital from tablename;

但在尝试从其输出创建表时不起作用。类似:

查询2。

 create table new_table 
    as 
    select country_key, MyFunction(country_key,"/data/MyData.txt") as capital from tablename;

它甚至不能从外部选择工作。类似:

查询3。

select t.capital from 
(
select country_key, MyFunction(country_key,"/data/MyData.txt") as capital from tablename
) t;

下面是我的UDF的评估函数:

public class CountryMap extends UDF{
    Map<Integer, String> countryMap =  null;
    public String evaluate(Integer keyCol, String mapFile) {

        if (countryMap == null){
            //read comma delimited data from mapFile and build a hashmap
                countryMap.put(key, value);
            }
        if (countryMap.containsKey(keyCol)) {
                return countryMap.get(keyCol);
            }
        return "NA";
    }
}

在Hive中添加jar、文件和创建Hive临时函数,如:

ADD JAR /data/CountryMap-with-dependencies.jar;
ADD FILE /data/MyData.txt;
CREATE TEMPORARY FUNCTION MyFunction as 'CountryMap';

当我运行查询1时,我从Map中得到期望的值,但当我运行询问2和3时,我得到"NA"。当我为查询2和3返回Map.size()来代替"NA"时,它为零。

我很困惑为什么外部选择或创建表无法获取coutryMap()值,以及为什么Map的大小变为零。

您使用的是什么版本的Hive?在0.14.0之前,您必须使用set hive.cache.expr.evaluation = false;才能绕过一个错误。

相关内容

  • 没有找到相关文章

最新更新