commit 6308c9c5fb3f3572ab4c382272caa1ad9f586b60 Author: Mithun RK Date: Mon Oct 2 14:00:38 2017 -0700 HIVE-17669: Cache to optimize SearcArgument deserialization (Chris Drome, reviewed by Mithun Radhakrishnan) diff --git a/ql/src/java/org/apache/hadoop/hive/ql/io/sarg/ConvertAstToSearchArg.java b/ql/src/java/org/apache/hadoop/hive/ql/io/sarg/ConvertAstToSearchArg.java index 997334b0de..4e52809572 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/io/sarg/ConvertAstToSearchArg.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/io/sarg/ConvertAstToSearchArg.java @@ -21,13 +21,14 @@ import java.sql.Date; import java.sql.Timestamp; import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import org.apache.commons.codec.binary.Base64; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hive.common.type.HiveChar; import org.apache.hadoop.hive.common.type.HiveDecimal; import org.apache.hadoop.hive.ql.exec.SerializationUtilities; -import org.apache.hadoop.hive.ql.io.sarg.LiteralDelegate; import org.apache.hadoop.hive.ql.plan.ExprNodeColumnDesc; import org.apache.hadoop.hive.ql.plan.ExprNodeConstantDesc; import org.apache.hadoop.hive.ql.plan.ExprNodeDesc; @@ -438,6 +439,25 @@ private void parse(ExprNodeDesc expression) { public static final String SARG_PUSHDOWN = "sarg.pushdown"; + private static Map cache = new ConcurrentHashMap<>(); + + private static SearchArgument getSearchArgumentFromString(String sargString) { + SearchArgument sarg = cache.get(sargString); + if (sarg == null) { + sarg = create(sargString); + cache.put(sargString, sarg); + } + return sarg; + } + + private static SearchArgument getSearchArgumentFromExpression(Configuration conf, String sargString) { + SearchArgument sarg = cache.get(sargString); + if (sarg == null) { + sarg = create(conf, SerializationUtilities.deserializeExpression(sargString)); + cache.put(sargString, sarg); + } + return sarg; + } public static SearchArgument create(Configuration conf, ExprNodeGenericFuncDesc expression) { return new ConvertAstToSearchArg(conf, expression).buildSearchArgument(); @@ -459,9 +479,9 @@ public static SearchArgument create(byte[] kryoBytes) { public static SearchArgument createFromConf(Configuration conf) { String sargString; if ((sargString = conf.get(TableScanDesc.FILTER_EXPR_CONF_STR)) != null) { - return create(conf, SerializationUtilities.deserializeExpression(sargString)); + return getSearchArgumentFromExpression(conf, sargString); } else if ((sargString = conf.get(SARG_PUSHDOWN)) != null) { - return create(sargString); + return getSearchArgumentFromString(sargString); } return null; }