Index: ql/src/java/org/apache/hadoop/hive/ql/udf/UDFJson.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/udf/UDFJson.java (revision 4293) +++ ql/src/java/org/apache/hadoop/hive/ql/udf/UDFJson.java (working copy) @@ -20,7 +20,10 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -59,7 +62,24 @@ private Pattern pattern_key = Pattern.compile("^([a-zA-Z0-9_\\-]+).*"); private Pattern pattern_index = Pattern.compile("\\[([0-9]+|\\*)\\]"); + // LRU Cache for jsonObject + private static final float HT_LOAD_FACTOR = 0.75f; + private static final int CACHE_SIZE = 16; + private static final int HT_SIZE = (int)Math.ceil(CACHE_SIZE / HT_LOAD_FACTOR) + 1; + + Map jsonObjectCache = Collections.synchronizedMap( + new LinkedHashMap(HT_SIZE, HT_LOAD_FACTOR, true) { + // (an anonymous inner class) + private static final long serialVersionUID = 1; + @Override protected boolean removeEldestEntry (Map.Entry eldest) { + return size() > CACHE_SIZE; + } + }); + + Text result = new Text(); + ArrayList jsonList = new ArrayList(); + public UDFJson() { } @@ -100,7 +120,11 @@ if (!pathExpr[0].equalsIgnoreCase("$")) { return null; } - Object extractObject = new JSONObject(jsonString); + Object extractObject = jsonObjectCache.get(jsonString); + if(extractObject == null) { + extractObject = new JSONObject(jsonString); + jsonObjectCache.put(jsonString, extractObject); + } for (int i = 1; i < pathExpr.length; i++) { extractObject = extract(extractObject, pathExpr[i]); } @@ -132,7 +156,8 @@ private Object extract_json_withindex(Object json, ArrayList indexList) throws JSONException { - ArrayList jsonList = new ArrayList(); + + jsonList.clear(); jsonList.add(json); Iterator itr = indexList.iterator(); while (itr.hasNext()) {