diff --git a/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java b/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java index ea173c8..7640180 100644 --- a/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java +++ b/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java @@ -1079,6 +1079,8 @@ private static void populateLlapDaemonVarsSet(Set llapDaemonVarsSetLocal + " expressed as multiple of Local FS write cost"), HIVE_CBO_COST_MODEL_HDFS_READ("hive.cbo.costmodel.hdfs.read", "1.5", "Default cost of reading a byte from HDFS;" + " expressed as multiple of Local FS read cost"), + HIVE_CBO_SHOW_WARNINGS("hive.cbo.show.warnings", "false", + "Toggle display of CBO warnings like missing column stats"), AGGR_JOIN_TRANSPOSE("hive.transpose.aggr.join", false, "push aggregates through join"), SEMIJOIN_CONVERSION("hive.enable.semijoin.conversion", true, "convert group by followed by inner equi join into semijoin"), HIVE_COLUMN_ALIGNMENT("hive.order.columnalignment", true, "Flag to control whether we want to try to align" + diff --git a/ql/src/java/org/apache/hadoop/hive/ql/Context.java b/ql/src/java/org/apache/hadoop/hive/ql/Context.java index bbdce63..5281d52 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/Context.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/Context.java @@ -23,6 +23,7 @@ import java.io.IOException; import java.net.URI; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.IdentityHashMap; @@ -125,6 +126,25 @@ private Heartbeater heartbeater; private boolean skipTableMasking; + + // Session visible warning messages emitted during query compile, like missing stats + private List compilerWarningMessages = new ArrayList<>(); + + /** + * ThreadLocal context allows retrieving the context from deep in the call stack + * w/o carrying it through params. + */ + private final static ThreadLocal localContext = new ThreadLocal<>(); + + /** + * Gets the current thread Context. + * The context is installed into the thread by CTOR and removed by clear() + * @return + */ + public static Context getCurrent() { + return localContext.get(); + } + /** * This determines the prefix of the * {@link org.apache.hadoop.hive.ql.parse.SemanticAnalyzer.Phase1Ctx#dest} @@ -192,6 +212,7 @@ public Context(Configuration conf, String executionId) { scratchDirPermission = HiveConf.getVar(conf, HiveConf.ConfVars.SCRATCHDIRPERMISSION); stagingDir = HiveConf.getVar(conf, HiveConf.ConfVars.STAGINGDIR); opContext = new CompilationOpContext(); + localContext.set(this); } @@ -614,6 +635,7 @@ public void clear() throws IOException { removeScratchDir(); originalTracker = null; setNeedLockMgr(false); + localContext.remove(); } public DataInput getStream() { @@ -886,4 +908,12 @@ public void resetOpContext(){ opContext = new CompilationOpContext(); sequencer = new AtomicInteger(); } + + public void addCompilerWarningMessage(String message) { + compilerWarningMessages.add(message); + } + + public List getCompilerWarningMessages() { + return compilerWarningMessages; + } } diff --git a/ql/src/java/org/apache/hadoop/hive/ql/Driver.java b/ql/src/java/org/apache/hadoop/hive/ql/Driver.java index efa2bdc..58bed0d 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/Driver.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/Driver.java @@ -572,6 +572,13 @@ public void run() { } } } + + boolean showCBOWarnings = HiveConf.getBoolVar(conf, ConfVars.HIVE_CBO_SHOW_WARNINGS); + if (showCBOWarnings) { + for(String message : ctx.getCompilerWarningMessages()) { + console.printInfo(message); + } + } return 0; } catch (Exception e) { if (isInterrupted()) { diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/RelOptHiveTable.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/RelOptHiveTable.java index 009d9e5..4098cf6 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/RelOptHiveTable.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/RelOptHiveTable.java @@ -44,6 +44,7 @@ import org.apache.hadoop.hive.conf.HiveConf; import org.apache.hadoop.hive.metastore.api.FieldSchema; import org.apache.hadoop.hive.metastore.api.Order; +import org.apache.hadoop.hive.ql.Context; import org.apache.hadoop.hive.ql.exec.ColumnInfo; import org.apache.hadoop.hive.ql.metadata.HiveException; import org.apache.hadoop.hive.ql.metadata.Partition; @@ -391,6 +392,7 @@ private void updateColStats(Set projIndxLst, boolean allowNullColumnFor noColsMissingStats.getAndAdd(colNamesFailedStats.size()); if (allowNullColumnForMissingStats) { LOG.warn(logMsg); + Context.getCurrent().addCompilerWarningMessage(logMsg); } else { LOG.error(logMsg); throw new RuntimeException(logMsg);