我们用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;
才能绕过一个错误。