HiveUDF读取HDFS上的资源文件

本文介绍了如何在Hive的用户自定义函数(UDF)TransformCodeToCode中加载并处理外部资源文件,包括将资源打包到JAR或存放在HDFS,以及如何通过参数动态加载和解析文件内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景:
在hive中编写UDF时,我们可能会加载外部的资源文件,可以将资源打到Jar中 ,将资源放在hdfs上,在使用UDF时通过参数就可以加载到。

代码

public class TransformCodeToCode extends GenericUDF {

    private MapredContext context;

    private Configuration conf;

    private FileSystem fileSystem;

    private boolean parseFlag = false;

    private Map<String,String> codeToCodeMap = new HashMap();

    @Override
    public void configure(MapredContext context) {
        //通过context 我们可以获取到外部传入的配置即:-hiveconf 传入的变量值
        this.context = context;
    }

    //基本类型(Primitive),集合(List),键值对映射(Map),结构体(Struct),联合体(Union)。
    @Override
    public ObjectInspector initialize(ObjectInspector[] objectInspectors) throws UDFArgumentException {
        //校验参数长度是否为2
        if (objectInspectors == null || objectInspectors.length != 2) {
            throw new IllegalArgumentException("The function transform accepts 2 parameters.");
        }
        //校验参数是否为PRIMITIVE类型
        ObjectInspector inspectorOne = objectInspectors[0];
        if (!ObjectInspector.Category.PRIMITIVE.equals(inspectorOne.getCategory())) {
            throw new UDFArgumentException("Desired parameter type:PRIMITIVE, actual parameter type:" + inspectorOne.getTypeName());
        }
        ObjectInspector inspectorTwo = objectInspectors[1];
        if (!ObjectInspector.Category.PRIMITIVE.equals(inspectorTwo.getCategory())) {
            throw new UDFArgumentException("Desired parameter type:PRIMITIVE, actual parameter type:" + inspectorTwo.getTypeName());
        }
        return PrimitiveObjectInspectorFactory.javaStringObjectInspector;
    }

    @Override
    public Object evaluate(DeferredObject[] deferredObjects) throws HiveException {
        String fieldValue = String.valueOf(deferredObjects[0].get());
        String filename = String.valueOf(deferredObjects[1].get());
        FSDataInputStream open = null;
        BufferedReader bf = null;
        String returnStr;
        try {
            //如果解析过,先从map中获取
            if(parseFlag){
                returnStr = codeToCodeMap.get(fieldValue);
                if(returnStr != null){
                    return returnStr;
                }else {
                    return fieldValue;
                }
            }
            //初始化conf
            if(conf == null){
                if (context != null) {
                    conf = context.getJobConf();
                } else {
                    conf = SessionState.get().getConf();
                }
            }
            //读取hdfs上的文件
            String filePath = "/data/resource/" + filename + ".txt";
            fileSystem = FileSystem.get(conf);
            open = fileSystem.open(new Path(filePath));
            bf = new BufferedReader(new InputStreamReader(open));
            String lineStr;
            String frontStr;
            String laterStr = "";
            //遍历文件内容,放入map
            while ((lineStr = bf.readLine()) != null) {
                String[] strArr = lineStr.split("\\|\\^\\|");
                int length = strArr.length;
                if(length < 1){
                    continue;
                }
                frontStr = strArr[0];
                if(length >= 3){
                    laterStr = strArr[2];
                }
                codeToCodeMap.put(frontStr, laterStr);
            }
            parseFlag = true;
            returnStr = codeToCodeMap.get(fieldValue);
            if(returnStr != null){
                return returnStr;
            }else {
                return fieldValue;
            }
        } catch (Exception e) {
           throw new HiveException("reader hdfs file Exception" + e.getMessage());
        } finally {
            try {
                if (open != null) {
                    open .close();
                }
                if (bf != null) {
                    bf.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

   @Override
    public void close() throws IOException {
        fileSystem.close();
    }

    @Override
    public String getDisplayString(String[] strings) {
        return "TransformCodeToCode(" + strings[0] + "," + strings[1] + ")";
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风卷残尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值