Repository: hive Updated Branches: refs/heads/branch-3 6e5f3827a -> 507a6f7a9
HIVE-18767: Some alterPartitions invocations throw 'NumberFormatException: null' (Mass Dosage via Peter Vary) Project: http://git-wip-us.apache.org/repos/asf/hive/repo Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/507a6f7a Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/507a6f7a Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/507a6f7a Branch: refs/heads/branch-3 Commit: 507a6f7a90efdb27619a0eb122301ba882273316 Parents: 6e5f382 Author: Mass Dosage <massdos...@gmail.com> Authored: Wed Oct 24 09:18:01 2018 +0200 Committer: Peter Vary <pv...@cloudera.com> Committed: Wed Oct 24 09:18:01 2018 +0200 ---------------------------------------------------------------------- .../hive/metastore/utils/MetaStoreUtils.java | 11 ++- .../metastore/utils/TestMetaStoreUtils.java | 79 ++++++++++++++++++++ 2 files changed, 88 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hive/blob/507a6f7a/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/utils/MetaStoreUtils.java ---------------------------------------------------------------------- diff --git a/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/utils/MetaStoreUtils.java b/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/utils/MetaStoreUtils.java index 4bc819f..41f75da 100644 --- a/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/utils/MetaStoreUtils.java +++ b/standalone-metastore/src/main/java/org/apache/hadoop/hive/metastore/utils/MetaStoreUtils.java @@ -655,14 +655,21 @@ public class MetaStoreUtils { return true; } + /** + * Determines whether the "fast stats" for the passed partitions are the same. + * + * @param oldPart Old partition to compare. + * @param newPart New partition to compare. + * @return true if the partitions are not null, contain all the "fast stats" and have the same values for these stats, otherwise false. + */ public static boolean isFastStatsSame(Partition oldPart, Partition newPart) { // requires to calculate stats if new and old have different fast stats if ((oldPart != null) && (oldPart.getParameters() != null)) { for (String stat : StatsSetupConst.fastStats) { if (oldPart.getParameters().containsKey(stat)) { Long oldStat = Long.parseLong(oldPart.getParameters().get(stat)); - Long newStat = Long.parseLong(newPart.getParameters().get(stat)); - if (!oldStat.equals(newStat)) { + String newStat = newPart.getParameters().get(stat); + if (newStat == null || !oldStat.equals(Long.parseLong(newStat))) { return false; } } else { http://git-wip-us.apache.org/repos/asf/hive/blob/507a6f7a/standalone-metastore/src/test/java/org/apache/hadoop/hive/metastore/utils/TestMetaStoreUtils.java ---------------------------------------------------------------------- diff --git a/standalone-metastore/src/test/java/org/apache/hadoop/hive/metastore/utils/TestMetaStoreUtils.java b/standalone-metastore/src/test/java/org/apache/hadoop/hive/metastore/utils/TestMetaStoreUtils.java index 55ff150..0977014 100644 --- a/standalone-metastore/src/test/java/org/apache/hadoop/hive/metastore/utils/TestMetaStoreUtils.java +++ b/standalone-metastore/src/test/java/org/apache/hadoop/hive/metastore/utils/TestMetaStoreUtils.java @@ -27,6 +27,7 @@ import org.apache.hadoop.hive.metastore.annotation.MetastoreUnitTest; import org.apache.hadoop.hive.metastore.api.Database; import org.apache.hadoop.hive.metastore.api.EnvironmentContext; import org.apache.hadoop.hive.metastore.api.FieldSchema; +import org.apache.hadoop.hive.metastore.api.Partition; import org.apache.hadoop.hive.metastore.api.Table; import org.apache.hadoop.hive.metastore.client.builder.DatabaseBuilder; import org.apache.hadoop.hive.metastore.client.builder.TableBuilder; @@ -270,5 +271,83 @@ public class TestMetaStoreUtils { updateTableStatsSlow(db, tbl2, wh, false, false, null); verify(wh, never()).getFileStatusesForUnpartitionedTable(db, tbl2); } + + @Test + public void isFastStatsSameWithNullPartitions() { + Partition partition = new Partition(); + Assert.assertFalse(MetaStoreUtils.isFastStatsSame(null, null)); + Assert.assertFalse(MetaStoreUtils.isFastStatsSame(null, partition)); + Assert.assertFalse(MetaStoreUtils.isFastStatsSame(partition, null)); + } + + @Test + public void isFastStatsSameWithNoMatchingStats() { + Partition oldPartition = new Partition(); + Map<String, String> stats = new HashMap<>(); + oldPartition.setParameters(stats); + Assert.assertFalse(MetaStoreUtils.isFastStatsSame(oldPartition, null)); + stats.put("someKeyThatIsNotInFastStats","value"); + oldPartition.setParameters(stats); + Assert.assertFalse(MetaStoreUtils.isFastStatsSame(oldPartition, null)); + } + + @Test + public void isFastStatsSameMatchingButOnlyOneStat() { + Partition oldPartition = new Partition(); + Partition newPartition = new Partition(); + Map<String, String> stats = new HashMap<>(); + stats.put(StatsSetupConst.fastStats[0], "1"); + oldPartition.setParameters(stats); + newPartition.setParameters(stats); + Assert.assertFalse(MetaStoreUtils.isFastStatsSame(oldPartition, newPartition)); + } + + @Test + public void isFastStatsSameMatching() { + Partition oldPartition = new Partition(); + Partition newPartition = new Partition(); + Map<String, String> stats = new HashMap<>(); + for (int i=0; i<StatsSetupConst.fastStats.length; i++) { + stats.put(StatsSetupConst.fastStats[i], String.valueOf(i)); + } + oldPartition.setParameters(stats); + newPartition.setParameters(stats); + Assert.assertTrue(MetaStoreUtils.isFastStatsSame(oldPartition, newPartition)); + } + + @Test + public void isFastStatsSameDifferent() { + Partition oldPartition = new Partition(); + Partition newPartition = new Partition(); + Map<String, String> oldStats = new HashMap<>(); + for (int i=0; i<StatsSetupConst.fastStats.length; i++) { + oldStats.put(StatsSetupConst.fastStats[i], String.valueOf(i)); + } + oldPartition.setParameters(oldStats); + Map<String, String> newStats = new HashMap<>(); + for (int i=0; i<StatsSetupConst.fastStats.length; i++) { + //set the values to i+1 so they are different in the new stats + newStats.put(StatsSetupConst.fastStats[i], String.valueOf(i+1)); + } + newPartition.setParameters(newStats); + Assert.assertFalse(MetaStoreUtils.isFastStatsSame(oldPartition, newPartition)); + } + + @Test + public void isFastStatsSameNullStatsInNew() { + Partition oldPartition = new Partition(); + Partition newPartition = new Partition(); + Map<String, String> oldStats = new HashMap<>(); + for (int i=0; i<StatsSetupConst.fastStats.length; i++) { + oldStats.put(StatsSetupConst.fastStats[i], String.valueOf(i)); + } + oldPartition.setParameters(oldStats); + Map<String, String> newStats = new HashMap<>(); + for (int i=0; i<StatsSetupConst.fastStats.length; i++) { + newStats.put(StatsSetupConst.fastStats[i], null); + } + newPartition.setParameters(newStats); + Assert.assertFalse(MetaStoreUtils.isFastStatsSame(oldPartition, newPartition)); + } }