diff --git a/standalone-metastore/src/main/java/org/apache/hadoop/hive/common/ndv/hll/HLLConstants.java b/standalone-metastore/src/main/java/org/apache/hadoop/hive/common/ndv/hll/HLLConstants.java index f30750f..3a1d076 100644 --- a/standalone-metastore/src/main/java/org/apache/hadoop/hive/common/ndv/hll/HLLConstants.java +++ b/standalone-metastore/src/main/java/org/apache/hadoop/hive/common/ndv/hll/HLLConstants.java @@ -18,6 +18,8 @@ package org.apache.hadoop.hive.common.ndv.hll; +import java.util.stream.IntStream; + public class HLLConstants { // range of register index bits @@ -926,4 +928,6 @@ -680.306000000099, -704.050000000047, -850.486000000034, -757.43200000003, -713.308999999892, } }; + public static double[] inversePow2Data = IntStream.rangeClosed(0, Byte.MAX_VALUE).mapToDouble(v -> Math.pow + (2, -v)).toArray(); } diff --git a/standalone-metastore/src/main/java/org/apache/hadoop/hive/common/ndv/hll/HLLDenseRegister.java b/standalone-metastore/src/main/java/org/apache/hadoop/hive/common/ndv/hll/HLLDenseRegister.java index c52746e..12897fc 100644 --- a/standalone-metastore/src/main/java/org/apache/hadoop/hive/common/ndv/hll/HLLDenseRegister.java +++ b/standalone-metastore/src/main/java/org/apache/hadoop/hive/common/ndv/hll/HLLDenseRegister.java @@ -29,12 +29,6 @@ // bit packing private int maxRegisterValue; - // keep count of number of zeroes in registers - private int numZeroes; - - // compute and cache inverse power of 2 for register values - private double[] invPow2Register; - // number of register bits private int p; @@ -49,10 +43,7 @@ public HLLDenseRegister(int p, boolean bitPack) { this.p = p; this.m = 1 << p; this.register = new byte[m]; - this.invPow2Register = new double[m]; - Arrays.fill(invPow2Register, 1.0); this.maxRegisterValue = 0; - this.numZeroes = m; if (bitPack == false) { this.maxRegisterValue = 0xff; } @@ -80,14 +71,8 @@ public boolean set(int idx, byte value) { maxRegisterValue = value; } - // update number of zeros - if (register[idx] == 0 && value > 0) { - numZeroes--; - } - // set register value and compute inverse pow of 2 for register value register[idx] = value; - invPow2Register[idx] = Math.pow(2, -value); updated = true; } @@ -99,6 +84,12 @@ public int size() { } public int getNumZeroes() { + int numZeroes = 0; + for (byte b : register) { + if (b == 0) { + numZeroes++; + } + } return numZeroes; } @@ -115,13 +106,9 @@ public void merge(HLLRegister hllRegister) { // compare register values and store the max register value for (int i = 0; i < inRegister.length; i++) { - if (inRegister[i] > register[i]) { - if (register[i] == 0) { - numZeroes--; - } - register[i] = inRegister[i]; - invPow2Register[i] = Math.pow(2, -inRegister[i]); - } + final byte cb = register[i]; + final byte ob = inRegister[i]; + register[i] = ob > cb ? ob : cb; } // update max register value @@ -147,8 +134,8 @@ public int getMaxRegisterValue() { public double getSumInversePow2() { double sum = 0; - for (double d : invPow2Register) { - sum += d; + for (byte b : register) { + sum += HLLConstants.inversePow2Data[b]; } return sum; } @@ -160,7 +147,7 @@ public String toString() { sb.append("p: "); sb.append(p); sb.append(" numZeroes: "); - sb.append(numZeroes); + sb.append(getNumZeroes()); sb.append(" maxRegisterValue: "); sb.append(maxRegisterValue); return sb.toString(); @@ -176,14 +163,12 @@ public boolean equals(Object obj) { return false; } HLLDenseRegister other = (HLLDenseRegister) obj; - return numZeroes == other.numZeroes && maxRegisterValue == other.maxRegisterValue - && Arrays.equals(register, other.register); + return maxRegisterValue == other.maxRegisterValue && Arrays.equals(register, other.register); } @Override public int hashCode() { int hashcode = 0; - hashcode += 31 * numZeroes; hashcode += 31 * maxRegisterValue; hashcode += Arrays.hashCode(register); return hashcode;