【问题标题】:Hive UDF to fetch value from distributed cache not working with outer queriesHive UDF 从分布式缓存中获取值,不适用于外部查询
【发布时间】:2016-04-05 17:32:57
【问题描述】:

我们用 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 的大小变为零。

【问题讨论】:

    标签: hadoop hive hiveql udf hive-udf


    【解决方案1】:

    您使用什么版本的 Hive?在 0.14.0 之前,您必须 set hive.cache.expr.evaluation = false; 才能绕过 a bug

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-05
      • 1970-01-01
      • 2013-02-10
      • 2020-07-19
      • 2014-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多