hive udf从分布式缓存中获取值,不处理外部查询

juzqafwq  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(552)

我们已经用java编写了一个配置单元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;

下面是我的自定义项的评估函数:

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

在配置单元中添加jar、文件并创建配置单元临时函数,如:

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'时,它是零。
我很困惑为什么外部select或create表不能获取coutrymap()值,为什么Map的大小变为零。

m528fe3b

m528fe3b1#

你用什么版本的Hive?在0.14.0之前你必须 set hive.cache.expr.evaluation = false; 绕过虫子。

相关问题