Skip to content

Commit 21b3228

Browse files
authored
[fix](catalog) gen partition id by name (#39325)
Followup #38525 Previously, we use sequence number to generate partition id of table in hive metastore. for example, there are 2 partitions: `dt=2024-10-02` and `dt=2024-10-03`, the partition id will be 0 and 1. But if a new partition being added: `dt=2024-10-01`, the partiton id will be 0, 1, and 2. You can see, before, the id `0` is for `dt=2024-10-02`, but now `0` is for `dt=2024-10-01`. This PR use catalog/db/table/partition name to generate a id for the partition, so that each partition will have unique id.
1 parent 9ecc5ae commit 21b3228

File tree

3 files changed

+11
-17
lines changed

3 files changed

+11
-17
lines changed

fe/fe-core/src/main/java/org/apache/doris/datasource/hive/HiveMetaStoreCache.java

+4-10
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.apache.doris.common.security.authentication.AuthenticationConfig;
3535
import org.apache.doris.common.util.CacheBulkLoader;
3636
import org.apache.doris.common.util.LocationPath;
37+
import org.apache.doris.common.util.Util;
3738
import org.apache.doris.datasource.CacheException;
3839
import org.apache.doris.datasource.hive.AcidInfo.DeleteDeltaInfo;
3940
import org.apache.doris.datasource.property.PropertyConverter;
@@ -250,9 +251,8 @@ private HivePartitionValues loadPartitionValues(PartitionValueCacheKey key) {
250251
Map<Long, PartitionItem> idToPartitionItem = Maps.newHashMapWithExpectedSize(partitionNames.size());
251252
BiMap<String, Long> partitionNameToIdMap = HashBiMap.create(partitionNames.size());
252253
Map<Long, List<UniqueId>> idToUniqueIdsMap = Maps.newHashMapWithExpectedSize(partitionNames.size());
253-
long idx = 0;
254254
for (String partitionName : partitionNames) {
255-
long partitionId = idx++;
255+
long partitionId = Util.genIdByName(catalog.getName(), key.dbName, key.tblName, partitionName);
256256
ListPartitionItem listPartitionItem = toListPartitionItem(partitionName, key.types);
257257
idToPartitionItem.put(partitionId, listPartitionItem);
258258
partitionNameToIdMap.put(partitionName, partitionId);
@@ -273,7 +273,7 @@ private HivePartitionValues loadPartitionValues(PartitionValueCacheKey key) {
273273
singleUidToColumnRangeMap = ListPartitionPrunerV2.genSingleUidToColumnRange(singleColumnRangeMap);
274274
}
275275
Map<Long, List<String>> partitionValuesMap = ListPartitionPrunerV2.getPartitionValuesMap(idToPartitionItem);
276-
return new HivePartitionValues(idToPartitionItem, uidToPartitionRange, rangeToId, singleColumnRangeMap, idx,
276+
return new HivePartitionValues(idToPartitionItem, uidToPartitionRange, rangeToId, singleColumnRangeMap,
277277
partitionNameToIdMap, idToUniqueIdsMap, singleUidToColumnRangeMap, partitionValuesMap);
278278
}
279279

@@ -638,13 +638,12 @@ public void addPartitionsCache(String dbName, String tblName, List<String> parti
638638
Map<String, Long> partitionNameToIdMapBefore = copy.getPartitionNameToIdMap();
639639
Map<Long, List<UniqueId>> idToUniqueIdsMap = copy.getIdToUniqueIdsMap();
640640
Map<Long, PartitionItem> idToPartitionItem = new HashMap<>();
641-
long idx = copy.getNextPartitionId();
642641
for (String partitionName : partitionNames) {
643642
if (partitionNameToIdMapBefore.containsKey(partitionName)) {
644643
LOG.info("addPartitionsCache partitionName:[{}] has exist in table:[{}]", partitionName, tblName);
645644
continue;
646645
}
647-
long partitionId = idx++;
646+
long partitionId = Util.genIdByName(catalog.getName(), dbName, tblName, partitionName);
648647
ListPartitionItem listPartitionItem = toListPartitionItem(partitionName, key.types);
649648
idToPartitionItemBefore.put(partitionId, listPartitionItem);
650649
idToPartitionItem.put(partitionId, listPartitionItem);
@@ -653,7 +652,6 @@ public void addPartitionsCache(String dbName, String tblName, List<String> parti
653652
Map<Long, List<String>> partitionValuesMapBefore = copy.getPartitionValuesMap();
654653
Map<Long, List<String>> partitionValuesMap = ListPartitionPrunerV2.getPartitionValuesMap(idToPartitionItem);
655654
partitionValuesMapBefore.putAll(partitionValuesMap);
656-
copy.setNextPartitionId(idx);
657655
if (key.types.size() > 1) {
658656
Map<UniqueId, Range<PartitionKey>> uidToPartitionRangeBefore = copy.getUidToPartitionRange();
659657
// uidToPartitionRange and rangeToId are only used for multi-column partition
@@ -1075,7 +1073,6 @@ public static class HiveFileStatus {
10751073

10761074
@Data
10771075
public static class HivePartitionValues {
1078-
private long nextPartitionId;
10791076
private BiMap<String, Long> partitionNameToIdMap;
10801077
private Map<Long, List<UniqueId>> idToUniqueIdsMap;
10811078
private Map<Long, PartitionItem> idToPartitionItem;
@@ -1094,7 +1091,6 @@ public HivePartitionValues(Map<Long, PartitionItem> idToPartitionItem,
10941091
Map<UniqueId, Range<PartitionKey>> uidToPartitionRange,
10951092
Map<Range<PartitionKey>, UniqueId> rangeToId,
10961093
RangeMap<ColumnBound, UniqueId> singleColumnRangeMap,
1097-
long nextPartitionId,
10981094
BiMap<String, Long> partitionNameToIdMap,
10991095
Map<Long, List<UniqueId>> idToUniqueIdsMap,
11001096
Map<UniqueId, Range<ColumnBound>> singleUidToColumnRangeMap,
@@ -1103,7 +1099,6 @@ public HivePartitionValues(Map<Long, PartitionItem> idToPartitionItem,
11031099
this.uidToPartitionRange = uidToPartitionRange;
11041100
this.rangeToId = rangeToId;
11051101
this.singleColumnRangeMap = singleColumnRangeMap;
1106-
this.nextPartitionId = nextPartitionId;
11071102
this.partitionNameToIdMap = partitionNameToIdMap;
11081103
this.idToUniqueIdsMap = idToUniqueIdsMap;
11091104
this.singleUidToColumnRangeMap = singleUidToColumnRangeMap;
@@ -1112,7 +1107,6 @@ public HivePartitionValues(Map<Long, PartitionItem> idToPartitionItem,
11121107

11131108
public HivePartitionValues copy() {
11141109
HivePartitionValues copy = new HivePartitionValues();
1115-
copy.setNextPartitionId(nextPartitionId);
11161110
copy.setPartitionNameToIdMap(partitionNameToIdMap == null ? null : HashBiMap.create(partitionNameToIdMap));
11171111
copy.setIdToUniqueIdsMap(idToUniqueIdsMap == null ? null : Maps.newHashMap(idToUniqueIdsMap));
11181112
copy.setIdToPartitionItem(idToPartitionItem == null ? null : Maps.newHashMap(idToPartitionItem));

fe/fe-core/src/test/java/org/apache/doris/datasource/CatalogMgrTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -548,7 +548,7 @@ private HivePartitionValues loadPartitionValues(PartitionValueCacheKey key, List
548548
singleUidToColumnRangeMap = ListPartitionPrunerV2.genSingleUidToColumnRange(singleColumnRangeMap);
549549
}
550550
Map<Long, List<String>> partitionValuesMap = ListPartitionPrunerV2.getPartitionValuesMap(idToPartitionItem);
551-
return new HivePartitionValues(idToPartitionItem, uidToPartitionRange, rangeToId, singleColumnRangeMap, idx,
551+
return new HivePartitionValues(idToPartitionItem, uidToPartitionRange, rangeToId, singleColumnRangeMap,
552552
partitionNameToIdMap, idToUniqueIdsMap, singleUidToColumnRangeMap, partitionValuesMap);
553553
}
554554

fe/fe-core/src/test/java/org/apache/doris/planner/ListPartitionPrunerV2Test.java

+6-6
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,8 @@ public List<String> listPartitionNames(String dbName, String tblName) {
103103
String tblName = "tb";
104104
HiveMetaStoreCache.HivePartitionValues partitionValues = cache.getPartitionValues(dbName, tblName, types);
105105
Assert.assertEquals(1, partitionValues.getIdToPartitionItem().size());
106-
Assert.assertTrue(partitionValues.getIdToPartitionItem().containsKey(0L));
107-
List<PartitionKey> items = partitionValues.getIdToPartitionItem().get(0L).getItems();
106+
Assert.assertTrue(partitionValues.getIdToPartitionItem().containsKey(8882801933302843777L));
107+
List<PartitionKey> items = partitionValues.getIdToPartitionItem().get(8882801933302843777L).getItems();
108108
Assert.assertEquals(1, items.size());
109109
PartitionKey partitionKey = items.get(0);
110110
Assert.assertEquals("1.234", partitionKey.getKeys().get(0).toString());
@@ -116,8 +116,8 @@ public List<String> listPartitionNames(String dbName, String tblName) {
116116
cache.addPartitionsCache(dbName, tblName, values, types);
117117
HiveMetaStoreCache.HivePartitionValues partitionValues2 = cache.getPartitionValues(dbName, tblName, types);
118118
Assert.assertEquals(2, partitionValues2.getIdToPartitionItem().size());
119-
Assert.assertTrue(partitionValues2.getIdToPartitionItem().containsKey(1L));
120-
List<PartitionKey> items2 = partitionValues2.getIdToPartitionItem().get(1L).getItems();
119+
Assert.assertTrue(partitionValues2.getIdToPartitionItem().containsKey(7070400225537799947L));
120+
List<PartitionKey> items2 = partitionValues2.getIdToPartitionItem().get(7070400225537799947L).getItems();
121121
Assert.assertEquals(1, items2.size());
122122
PartitionKey partitionKey2 = items2.get(0);
123123
Assert.assertEquals("5.678", partitionKey2.getKeys().get(0).toString());
@@ -128,8 +128,8 @@ public List<String> listPartitionNames(String dbName, String tblName) {
128128
cache.invalidateTableCache(dbName, tblName);
129129
HiveMetaStoreCache.HivePartitionValues partitionValues3 = cache.getPartitionValues(dbName, tblName, types);
130130
Assert.assertEquals(1, partitionValues3.getIdToPartitionItem().size());
131-
Assert.assertTrue(partitionValues3.getIdToPartitionItem().containsKey(0L));
132-
List<PartitionKey> items3 = partitionValues3.getIdToPartitionItem().get(0L).getItems();
131+
Assert.assertTrue(partitionValues3.getIdToPartitionItem().containsKey(8882801933302843777L));
132+
List<PartitionKey> items3 = partitionValues3.getIdToPartitionItem().get(8882801933302843777L).getItems();
133133
Assert.assertEquals(1, items3.size());
134134
PartitionKey partitionKey3 = items3.get(0);
135135
Assert.assertEquals("1.234", partitionKey3.getKeys().get(0).toString());

0 commit comments

Comments
 (0)