我们已经用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的大小变为零。
1条答案
按热度按时间m528fe3b1#
你用什么版本的Hive?在0.14.0之前你必须
set hive.cache.expr.evaluation = false;
绕过虫子。