diff --git common/src/java/org/apache/hadoop/hive/common/StringableMap.java common/src/java/org/apache/hadoop/hive/common/StringableMap.java index 8a93c0fc12..1fc4b55b69 100644 --- common/src/java/org/apache/hadoop/hive/common/StringableMap.java +++ common/src/java/org/apache/hadoop/hive/common/StringableMap.java @@ -30,6 +30,14 @@ public class StringableMap extends HashMap { public StringableMap(String s) { + convertToMap(s, false); + } + + public StringableMap(String s, boolean isZeroValueEmptyString) { + convertToMap(s, isZeroValueEmptyString); + } + + private void convertToMap(String s, boolean isZeroValueEmptyString) { String[] parts = s.split(":", 2); // read that many chars int numElements = Integer.parseInt(parts[0]); @@ -43,6 +51,9 @@ public StringableMap(String s) { len = Integer.parseInt(parts[0]); String value = null; if (len > 0) value = parts[1].substring(0, len); + else if (isZeroValueEmptyString && len == 0) { + value = ""; + } s = parts[1].substring(len); put(key, value); } diff --git ql/src/java/org/apache/hadoop/hive/ql/txn/compactor/CompactorMR.java ql/src/java/org/apache/hadoop/hive/ql/txn/compactor/CompactorMR.java index 7f5c6d3fbe..d8de8aed40 100644 --- ql/src/java/org/apache/hadoop/hive/ql/txn/compactor/CompactorMR.java +++ ql/src/java/org/apache/hadoop/hive/ql/txn/compactor/CompactorMR.java @@ -723,7 +723,7 @@ private void getWriter(Reporter reporter, ObjectInspector inspector, options.inspector(inspector) .writingBase(jobConf.getBoolean(IS_MAJOR, false)) .isCompressed(jobConf.getBoolean(IS_COMPRESSED, false)) - .tableProperties(new StringableMap(jobConf.get(TABLE_PROPS)).toProperties()) + .tableProperties(new StringableMap(jobConf.get(TABLE_PROPS), true).toProperties()) .reporter(reporter) .minimumTransactionId(jobConf.getLong(MIN_TXN, Long.MAX_VALUE)) .maximumTransactionId(jobConf.getLong(MAX_TXN, Long.MIN_VALUE)) diff --git ql/src/test/org/apache/hadoop/hive/ql/TestTxnCommands2.java ql/src/test/org/apache/hadoop/hive/ql/TestTxnCommands2.java index d08371d89c..67b77ad9ba 100644 --- ql/src/test/org/apache/hadoop/hive/ql/TestTxnCommands2.java +++ ql/src/test/org/apache/hadoop/hive/ql/TestTxnCommands2.java @@ -930,6 +930,23 @@ public void updateDeletePartitioned() throws Exception { Assert.assertEquals("Update " + Table.ACIDTBLPART + " didn't match:", stringifyValues(expectedData), rs); } + /** + * https://issues.apache.org/jira/browse/HIVE-17391 + */ + @Test + public void testEmptyInTblproperties() throws Exception { + runStatementOnDriver("create table t1 " + "(a int, b int) stored as orc TBLPROPERTIES ('serialization.null.format'='', 'transactional'='true')"); + runStatementOnDriver("insert into t1 " + "(a,b) values(1,7),(3,7)"); + runStatementOnDriver("update t1" + " set b = -2 where b = 2"); + runStatementOnDriver("alter table t1 " + " compact 'MAJOR'"); + runWorker(hiveConf); + TxnStore txnHandler = TxnUtils.getTxnStore(hiveConf); + ShowCompactResponse resp = txnHandler.showCompact(new ShowCompactRequest()); + Assert.assertEquals("Unexpected number of compactions in history", 1, resp.getCompactsSize()); + Assert.assertEquals("Unexpected 0 compaction state", TxnStore.CLEANING_RESPONSE, resp.getCompacts().get(0).getState()); + Assert.assertTrue(resp.getCompacts().get(0).getHadoopJobId().startsWith("job_local")); + } + /** * https://issues.apache.org/jira/browse/HIVE-10151 */