append函数_【每日一题】Hive自定义哪些UDF函数? (瓜子二手车)

今天分享下瓜子二手车的面试题:Hive自定义哪些UDF函数?

01

问题分析

考官主要考核你工作中是否使用过自定义的UDF函数,因此需要准备2个及以上的自定义UDF函数。

02

核心问题回答

例如:自定义转换小写函数、自定义解析公共字段函数、自定义测试函数是否创建成功的函数以及自定义将json变成List集合的函数。
/**             * 自定义转换小写函数             */            public class MyLowerUDF extends UDF {                public Text evaluate(Text str){                    if(null == str.toString()){                        return null;                    }                    return new Text(str.toString().toLowerCase());                }            }            /**             * 自定义udf函数用于解析公共字段             */            public class BaseFieldUDF extends UDF {                public String evaluate(String line, String jsonKeysString) {                    StringBuilder result = new StringBuilder();                    if(StringUtils.isBlank(line)) {                        return null;                    }                    String[] lineSplit = line.split("\\|");                    if(lineSplit.length != 2 || StringUtils.isBlank(lineSplit[1])) {                        return null;                    } else {                        String[] jsonKeys = jsonKeysString.split(",");                        try {                            JSONObject baseContent = new JSONObject(lineSplit[1]);                            JSONObject jsonObject = baseContent.getJSONObject("cm");                            for(String jsonKey : jsonKeys) {                                if(jsonObject.has(jsonKey.trim())) {                                    result.append(jsonObject.getString(jsonKey.trim())).append("\t");                                } else {                                    result.append("\t");                                }                            }                            result.append(baseContent.getString("et")).append("\t");                            result.append(lineSplit[0]).append("\t");                        } catch (JSONException e) {                            e.printStackTrace();                        }                    }                    return result.toString();                }            }            /**            * 自定义测试函数是否创建成功的函数            */            public class MyHiveUDF extends UDF{                public Text evaluate(Text content) {                    return evaluate(content, new IntWritable(0));                }                    public Text evaluate(Text content, IntWritable flag) {                    if (content==null)                        return null;                    if(flag.get()==1) {                        return new Text(content.toString().toUpperCase());                    }else {                        return new Text(content.toString().toLowerCase());                     }                       }            }            /**            * 将json变成list集合,方便在hive中使用explode函数            */            public class JsonArray extends UDF{                /**                 * 由于hive中的null和java中的null不一样,因此这里将参数类型设置为Object                 * hive中的null非String类型,若传入的参数为null,则直接报错,所以设置参数类型为Object                 * @param jsonStr  可以接收的参数格式  [{},{}]或{"key1":[{},{}],"key2":[{},{}]}                 * @return    json数组转换后的list集合                 */                public ArrayList<String> evaluate(Object jsonStr){                    //非String类型,返回null                    if(!(jsonStr instanceof String)) {                        return null;                    }                    String jsonString = (String) jsonStr;                    if(jsonString.startsWith("[")){                        return getJsonList(jsonString);                    }else if(jsonString.startsWith("{")){                        return getAllJsonList(jsonString);                    }else{                        return null;                    }                }                // 将一个json数组进行转换操作后,返回一个list集合                // 例如:由"[{},{}]" ---> "list集合"                  // list集合在hive中相当于是数组,可以直接使用explode函数                public ArrayList<String> getJsonList(String jsonArrayString){                    if(jsonArrayString.length() == 0 || jsonArrayString == null) return null;                    JSONArray jsonArrayObj = null;                    try{                        jsonArrayObj = JSON.parseArray(jsonArrayString);                    }catch (Exception e){                        return null;                    }                    ArrayList<String> result = new ArrayList<String>();                    for(int i = 0 ; i                        result.add(jsonArrayObj.get(i).toString());                    }                    return result;                }                //将一个json数组{"key":[{},{}],"key":[{},{}]}进行转换操作,返回list集合 [{},{},{}]                public ArrayList<String> getAllJsonList(String jsonString){                    JSONObject jsonObject = null;                    try{                        jsonObject = JSON.parseObject(jsonString);                    }catch (Exception e){                        return null;                    }                    //获取json对象中所有的key                    Set<String> keys = jsonObject.keySet();                    ArrayList<Object> jsonObjList = new ArrayList<Object>();                    //获取所有的json对象(格式上是一个json数组)                    for (String key : keys) {                        jsonObjList.add(jsonObject.get(key));                    }                    ArrayList<String> result = new ArrayList<String>();                    //将所有的对象合并到一个list集合中返回                    for (Object jsonObj : jsonObjList) {                        ArrayList<String> jsonList = getJsonList(jsonObj.toString());                        result.addAll(jsonList);                    }                    return result;                }            }

推荐阅读:

【每日一题】说一下Hive怎么优化?(腾讯)

【每日一题】Flume事务实现 (今日头条)

【每日一题】Redis的热键问题?Redis的数据类型 (京东)

db413160fd86fbc02a2dfea4b91134db.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值