Hive UDF 读取文件进行HashMap查找
默认分类
2020-01-15
1065
0
最近碰到一个问题,Hive中需要解析URL后面拼接的字符串,但是字符串数量不定,而且要匹配对应值。每次SQL写起来特别麻烦,因此打算用UDF搞定。
UDF使用Java编写,可以在Hive脚本中使用,我们可以在UDF中读取文件并生成HashMap进行匹配。Solution
假设我们有一个数据集和一个Map文件。 URL Dataset
a1
a2
a3
a4
b1
b2
b3
Map File
a1 50平以下
a2 50-70平
a3 70-90平
a4 90-110平
UDF 注意其中有段代码判断Map是否为null,如果是null就初始化Map文件,否则重用就行。
import java.io.*;
import java.util.HashMap;
import java.util.Map;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.hive.ql.metadata.HiveException;
public class GetElement extends UDF {
private Map<String, String> elementMap;
public String evaluate(String elementId, String mapFile) throws HiveException {
if (elementMap == null) {
elementMap = new HashMap<String, String>();
try {
BufferedReader lineReader = new BufferedReader(new FileReader(mapFile));
String line = null;
while ((line = lineReader.readLine()) != null) {
String[] pair = line.split("\t");
String id = pair[0];
String name = pair[1];
elementMap.put(id, name);
}
} catch (FileNotFoundException e) {
System.out.println(e);
throw new HiveException(mapFile + " doesn't exist");
} catch (IOException e) {
throw new HiveException("process file " + mapFile + " failed, please check format");
}
}
if (elementMap.containsKey(elementId)) {
return elementMap.get(elementId);
}
return null;
}
}
Reference
Using Hive UDF to Perform Correlated Subquery Use a lookup HashMap in hive script with UDF
0条评论