今天分享下瓜子二手车的面试题: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的数据类型 (京东)

278

被折叠的 条评论
为什么被折叠?



