

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

# 將 Amazon S3 庫存報告中的空白版本 ID 字串轉換為空字串
<a name="inventory-configure-bops"></a>

**注意**  
**下列處理程序僅適用於包含所有版本的 Amazon S3 庫存報告，且僅當「所有版本」報告用作已啟用 S3 版本控制之儲存貯體上 S3 批次操作的資訊清單時。**您不需要為僅指定最新版本的 S3 庫存報告轉換字串。

您可以使用 S3 庫存報告作為 S3 批次操作的資訊清單。不過，在儲存貯體上啟用 S3 版本控制時，包含所有版本的 S3 庫存報告會在版本 ID 欄位中以空字串標示任何未進行版本控制的物件。當庫存報告包含所有物件版本 ID 時，批次操作會辨識 `null` 字串作為版本 ID，但不能為空字串。

當 S3 批次操作任務使用「所有版本」S3 庫存報告作為資訊清單時，在版本 ID 欄位中具有空字串之物件上的所有任務都會失敗。若要將 S3 庫存報告的版本 ID 欄位中的空字串轉換為批次操作的 `null` 字串，請使用以下處理程序。

**更新 Amazon S3 庫存報告以搭配批次操作使用**

1. 登入 AWS 管理主控台 ，並在 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)：// 開啟 Amazon S3 主控台。

1. 導覽至您的 S3 庫存報告。庫存報告位於您在設定庫存報告時所指定的目的地儲存貯體。如需有關尋找庫存報告的詳細資訊，請參閱 [尋找您的清查清單](storage-inventory-location.md)。

   1. 選擇目的地儲存貯體。

   1. 選擇 資料夾。以原始來源儲存貯體命名資料夾。

   1. 選擇以庫存組態命名的資料夾。

   1. 選取名為 **hive** 資料夾旁邊的核取方塊。在頁面頂端，選擇 **Copy S3 URI** (複製 S3 URI)，複製資料夾的 S3 URI。

1. 前往 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 開啟 Amazon Athena 主控台。

1. 在查詢編輯器中，選擇 **Settings** (設定)，然後選擇 **Manage** (管理)。在 **Manage settings** (管理設定) 頁面，對於 **Location of query result** (查詢結果的位置)，請選擇 S3 儲存貯體來存放查詢結果。

1. 在查詢編輯器中，建立 Athena 資料表，以使用下列命令保留庫存報告中的資料。使用您選擇的名稱取代 `table_name`，並在 `LOCATION` 子句中，插入您先前複製的 S3 URI。然後選擇 **Run** (執行) 來執行查詢。

   ```
   CREATE EXTERNAL TABLE table_name(bucket string, key string, version_id string) PARTITIONED BY (dt string)ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.SymlinkTextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat' LOCATION 'Copied S3 URI';
   ```

1. 若要清除查詢編輯器，請選擇 **Clear** (清除)。之後，使用下列命令將庫存報告載入資料表。使用您在上一個步驟中選擇的項目取代 `table_name`。然後選擇 **Run** (執行) 來執行查詢。

   ```
   MSCK REPAIR TABLE table_name;
   ```

1. 若要清除查詢編輯器，請選擇 **Clear** (清除)。執行下列 `SELECT` 查詢來擷取原始庫存報告中的所有項目，並將任何空白的版本 ID 取代為 `null` 字串。使用您之前選擇的項目取代 `table_name`，並使用您想要此工具在庫存報告上執行的日期取代 `WHERE` 子句中的 `YYYY-MM-DD-HH-MM`。然後選擇 **Run** (執行) 來執行查詢。

   ```
   SELECT bucket as Bucket, key as Key, CASE WHEN version_id = '' THEN 'null' ELSE version_id END as VersionId FROM table_name WHERE dt = 'YYYY-MM-DD-HH-MM';
   ```

1. 退回 Amazon S3 主控台 ([https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/))，並導覽至您之前為 **Location of query result** (查詢結果位置) 選擇的 S3 儲存貯體。其中應該有一系列以日期結尾的資料夾。

   例如，您應該會看到類似 **s3://**amzn-s3-demo-bucket**/*query-result-location*/Unsaved/2021/10/07/** 的項目。您應該會看到包含您所執行之 `SELECT` 查詢結果的 `.csv` 檔案。

   選擇具有最新修改日期的 CSV 檔案。將此檔案下載到您的本機電腦，以進行下一個步驟。

1. 產生的 CSV 檔案包含標頭列。若要使用此 CSV 檔案作為 S3 批次操作任務的輸入，您必須移除標頭列，因為批次操作不支援 CSV 資訊清單上的標頭列。

   若要移除標頭列，您可以對檔案執行下列其中一個命令。用您的 CSV 檔案名稱取代 *`file.csv`*。

   **對於 macOS 和 Linux 電腦**，請在終端機視窗中執行 `tail` 命令。

   ```
   tail -n +2 file.csv > tmp.csv && mv tmp.csv file.csv 
   ```

   **對於 Windows 電腦**，請在 Windows PowerShell 視窗中執行下列指令碼。將 `File-location` 替換為您的檔案路徑，並將 `file.csv` 替換為檔案名稱。

   ```
   $ins = New-Object System.IO.StreamReader File-location\file.csv
   $outs = New-Object System.IO.StreamWriter File-location\temp.csv
   try {
       $skip = 0
       while ( !$ins.EndOfStream ) {
           $line = $ins.ReadLine();
           if ( $skip -ne 0 ) {
               $outs.WriteLine($line);
           } else {
               $skip = 1
           }
       }
   } finally {
       $outs.Close();
       $ins.Close();
   }
   Move-Item File-location\temp.csv File-location\file.csv -Force
   ```

1. 從 CSV 檔案中移除標頭列之後，您就可以在 S3 批次操作任務中將其用作資訊清單。將 CSV 檔案上傳到 S3 儲存貯體或您選擇的位置，然後使用 CSV 檔案作為資訊清單建立批次操作任務。

   如需有關建立 S3 批次操作任務的詳細資訊，請參閱 [建立 S3 批次操作任務](batch-ops-create-job.md)。