我们在explan sql
时候发现 width 是负数,事实上原因
width是通过data Size / rowNum计算出来的,这两个参数都是在执行计划中根据每个operator通过stats计算出来的。对于select query来说,data size是根据column stats、尤其是non-null的数据计算出来的,这些non-null value按照如下公式计算: long nonNullCount = cs.getNumNulls() > 0 ? numRows - cs.getNumNulls() + 1 : numRows; 不过有时候总计的行数会比null value数量少,因此会导致负数的row count和负数的data size。由于这些数据都是预估的数值,因此的确有发生这种问题的可能。 根据公示Max(1, Min(hive.exec.reducers.max [1099], ReducerStage estimate/hive.exec.reducers.bytes.per.reducer)) x hive.tez.max.partition.factor ,data size会在optimizer估算reducer数量的时候用到,因此如果data size为负数,最后生成reducer数量为1。 然后hive.tez.max.partition.factor 默认值为2 ,导致 redcue 最终生成值为2.
解决方式是,不用hive 元数据的 column stats ,而是使用其他方式预估功能。参数为 set hive.stats.fetch.column.stats=false; 既可解决reduce 一直为2的问题
标签:stats,reducer,reduce,hive,负数,sql,data,size From: https://www.cnblogs.com/kxming/p/17646176.html