

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 合併兩個碎片
<a name="kinesis-using-sdk-java-resharding-merge"></a>

 碎片合併操作需要兩個指定的碎片，並且會將它們合併為單一碎片。合併之後，該單一子碎片會收到兩個父碎片涵蓋的所有雜湊索引鍵值的資料。

**碎片相鄰**  
若要合併兩個碎片，碎片必須*相鄰*。如果兩個碎片的雜湊索引鍵範圍的聯結形成連續的一組 (無間隙)，則將其視為相鄰。舉例來說，假設您有兩個碎片，其中一個的雜湊鍵範圍為 276...381，另一個的雜湊鍵範圍為 382...454。您可以將這兩個碎片合併為一個碎片，就會得到範圍為 276...454 的雜湊鍵。

再舉另一個例子，假設您有兩個碎片，其中一個的雜湊鍵範圍為 276...381，另一個的雜湊鍵範圍為 455...560。您可以合併這兩個碎片，因為這樣在這兩個碎片之間就會有一個或多個碎片，範圍涵蓋 382...454。

串流中所有 `OPEN` 碎片的集合 – 群組形式 – 一律會跨越 MD5 雜湊索引鍵值的整個範圍。如需碎片狀態—例如 `CLOSED`—的詳細資訊，請參閱 [考慮重新碎片之後的資料路由、資料持久性和碎片狀態](kinesis-using-sdk-java-after-resharding.md#kinesis-using-sdk-java-resharding-data-routing)。

若要識別用於合併之候選項目的碎片，您應該篩選掉處於 `CLOSED` 狀態的所有碎片。狀態為 `OPEN` (即非 `CLOSED`) 的碎片，其結束序號為 `null`。您可以使用下列方式來測試碎片的結束序號：

```
if( null == shard.getSequenceNumberRange().getEndingSequenceNumber() ) 
{
  // Shard is OPEN, so it is a possible candidate to be merged.
}
```

篩選掉排序關閉碎片後，將剩餘的碎片依每個碎片支援的最高雜湊索引鍵值排序。您可以使用下列方式來擷取此值：

```
shard.getHashKeyRange().getEndingHashKey();
```

 如果在這個經篩選、排序之清單中的兩個碎片為相鄰，則可以將它們合併。

**合併操作的程式碼**  
 以下程式碼會合併兩個碎片。此程式碼假設 `myStreamName` 擁有串流的名稱，以及物件變數 `shard1` 和 `shard2` 則擁有要合併的兩個相鄰碎片。

對於合併操作，從將新的 `mergeShardsRequest` 物件執行個體化開始。使用 `setStreamName` 方法指定串流名稱。然後，使用 `setShardToMerge` 和 `setAdjacentShardToMerge` 方法指定要合併的兩個碎片。最後，呼叫 Kinesis Data Streams 用戶端上的 `mergeShards` 方法，以執行操作。

```
MergeShardsRequest mergeShardsRequest = new MergeShardsRequest();
mergeShardsRequest.setStreamName(myStreamName);
mergeShardsRequest.setShardToMerge(shard1.getShardId());
mergeShardsRequest.setAdjacentShardToMerge(shard2.getShardId());
client.mergeShards(mergeShardsRequest);
```

[等待串流再次變成作用中](kinesis-using-sdk-java-after-resharding.md#kinesis-using-sdk-java-resharding-wait-until-active)中顯示此程序後的第一個步驟。