This website requires JavaScript.

Hive UDF 读取文件进行HashMap查找

最近碰到一个问题,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条评论
avatar