

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

# 在 Amazon S3 中連接多個檔案中的資料
<a name="datasets.multiple-files"></a>

使用 DataBrew 主控台，您可以導覽 Amazon S3 儲存貯體和資料夾，並為資料集選擇一個檔案。不過，資料集不需要限制為一個檔案。

假設您有一個名為 的 S3 儲存貯體`my-databrew-bucket`，其中包含名為 的資料夾`databrew-input`。在該資料夾中，假設您有許多 JSON 檔案，所有檔案都具有相同的檔案格式和副`.json`檔名。在 主控台上，您可以指定 的來源 URL`s3://my-databrew-bucket/databrew-input/`。在 DataBrew 主控台上，您可以選擇此資料夾。您的資料集包含該資料夾中的所有 JSON 檔案。

DataBrew 可以處理 S3 資料夾中的所有檔案，但前提是符合下列條件：
+ 資料夾中的所有檔案都具有相同的格式。
+ 資料夾中的所有檔案都有相同的副檔名。

如需支援的檔案格式和副檔名的詳細資訊，請參閱 [DataBrew input formats](supported-data-file-sources.md#datasets.databrew-input-formats)。

## 使用多個檔案做為資料集時的結構描述
<a name="datasets.multiple-files-schemas-multiple-files"></a>

使用多個檔案做為 DataBrew 資料集時，所有檔案的結構描述都必須相同。否則，專案工作區會自動嘗試從多個檔案選擇其中一個結構描述，並嘗試將其他資料集檔案符合該結構描述。此行為會導致在專案工作區期間顯示的檢視不規律，因此任務輸出也會不規律。

如果您的檔案必須具有不同的結構描述，您需要建立多個資料集並分別進行描述。

## 使用 Amazon S3 的參數化路徑
<a name="datasets.multiple-files.parameterized-s3"></a>

在某些情況下，您可能想要使用遵循特定命名慣例的檔案建立資料集，或建立可以跨越多個 Amazon S3 資料夾的資料集。或者，您可能想要針對在 S3 位置中定期產生的相同結構化資料重複使用相同的資料集，路徑取決於特定參數。範例是名為 的路徑，用於資料生產日期。

DataBrew 支援此方法搭配參數化 S3 路徑。*參數化路徑*是包含規則表達式或自訂路徑參數或兩者的 Amazon S3 URL。

### 使用規則表達式以 S3 路徑定義資料集
<a name="defining.dataset.with.s3.path.using.regex"></a>

路徑中的規則表達式對於比對一或多個資料夾的多個檔案很有用，同時篩選掉這些資料夾中不相關的檔案。

以下是幾個範例：
+ 定義資料集，其中包含名稱開頭為 之資料夾的所有 JSON 檔案`invoice`。
+ 定義包含資料夾中所有檔案的資料集，其名稱`2020`為 。

您可以在資料集 S3 路徑中使用規則表達式來實作此類方法。這些規則表達式可以取代 S3 URL 金鑰中的任何子字串 （但不能取代儲存貯體名稱）。

作為 S3 URL 中金鑰的範例，請參閱以下內容。這裡`my-bucket`是儲存貯體名稱，美國東部 （俄亥俄） 是AWS區域，而 `puppy.png`是金鑰名稱。

`https://my-bucket.s3.us-west-2.amazonaws.com/puppy.png` 

在參數化 S3 路徑中，兩個角括號 (`<` 和 `>`) 之間的任何字元都會視為規則表達式。下列為兩個範例：
+ `s3://my-databrew-bucket/databrew-input/invoice<.*>/data.json` 會在`databrew-input`名稱開頭為 的所有 子資料夾中`data.json`，比對名為 的所有檔案`invoice`。
+ `s3://my-databrew-bucket/databrew-input/<.*>2020<.*>/` 會比對資料夾中的所有檔案，其名稱`2020`為 。

在這些範例中， `.*`符合零個或多個字元。

**注意**  
您只能在 S3 路徑的索引鍵部分中使用規則表達式，也就是在儲存貯體名稱後面的部分。因此， `s3://my-databrew-bucket/<.*>-input/` 是有效的，但`s3://my-<.*>-bucket/<.*>-input/`不是。

我們建議您測試規則表達式，以確保它們只符合您想要的 S3 URL，而不是您不想要的 S3 URLs。

以下是規則表達式的一些其他範例：
+ `<\d{2}>` 會比對由正好兩個連續數字組成的字串，例如 `07`或 `03`，但不是 `1a2`。
+ `<[a-z]+.*>` 符合以一個或多個小寫拉丁字母開頭的字串，後面有零個或多個其他字元。範例為 `a3`、 `abc/def`或 `a-z`，但不是 `A2`。
+ `<[^/]+>` 符合字串，其中包含除了斜線 (**/**) 以外的任何字元。在 S3 URL 中，斜線用於分隔路徑中的資料夾。
+ `<.*=.*>` 符合包含等號 (=) 的字串`abc/day=2`，例如 `month=02`、 或 `=10`，但不符合 `test`。
+ `<\d.*\d>` 符合以數字開頭和結尾的字串，且數字之間可以有任何其他字元，例如 `1abc2`、 `01-02-03`或 `2020/Jul/21`，但不能有 `123a`。

### 使用自訂參數以 S3 路徑定義資料集
<a name="defining.dataset.with.s3.path.using.custom.parameters"></a>

當您可能想要提供 S3 位置的參數時，使用自訂參數定義參數化資料集可提供優於使用規則表達式的優勢：
+ 您可以使用規則表達式達到與 相同的結果，而不需要知道規則表達式的語法。您可以使用熟悉的術語定義參數，例如「開頭」和「包含」。
+ 當您使用路徑中的參數定義動態資料集時，您可以在定義中包含時間範圍，例如「過去一個月」或「過去 24 小時」。如此一來，您的資料集定義稍後將與新的傳入資料搭配使用。

以下是一些您可能想要使用動態資料集的範例：
+ 將依*上次更新*日期或其他有意義的屬性分割的多個檔案連接到單一資料集。然後，您可以將這些分割區屬性擷取為資料集中的額外資料欄。
+ 將資料集中的檔案限制為符合特定條件的 S3 位置。例如，假設您的 S3 路徑包含日期型資料夾，例如 `folder/2021/04/01/`。在這種情況下，您可以參數化日期，並將其限制為特定範圍，例如「2021 年 3 月 1 日至 2021 年 4 月 1 日」或「上週」。

若要使用參數定義路徑，請定義參數，並使用下列格式將其新增至路徑：

`s3://my-databrew-bucket/some-folder/{parameter1}/file-{parameter2}.json`

**注意**  
如同 S3 路徑中的規則表達式，您只能在路徑的索引鍵部分使用參數，也就是在儲存貯體名稱後面的部分。

參數定義、名稱和類型中需要兩個欄位。類型可以是**字串**、**數字**或**日期**。**日期**類型的參數必須具有日期格式的定義，以便 DataBrew 可以正確解譯和比較日期值。或者，您可以定義參數的相符條件。您也可以選擇在 DataBrew 任務或互動式工作階段載入參數時，將參數的相符值作為資料欄新增至資料集。

#### 範例
<a name="dynamic.dataset.example"></a>

讓我們考慮使用 DataBrew 主控台中的參數定義動態資料集的範例。在此範例中，假設輸入資料使用下列位置定期寫入 S3 儲存貯體：
+ `s3://databrew-dynamic-datasets/new-cases/UR/daily-report-2021-03-30.csv`
+ `s3://databrew-dynamic-datasets/new-cases/UR/daily-report-2021-03-31.csv`
+ `s3://databrew-dynamic-datasets/new-cases/US/daily-report-2021-03-30.csv`
+ `s3://databrew-dynamic-datasets/new-cases/US/daily-report-2021-03-31.csv`

這裡有兩個動態部分：國家/地區代碼，例如美國，以及檔案名稱中的日期，例如 2021-03-30。在這裡，您可以為所有檔案套用相同的清除配方。假設您想要每天執行清除任務。以下是您可以為此案例定義參數化路徑的方式：

1. 導覽至特定檔案。

1. 然後選取不同的部分，例如日期，並以參數取代。在此情況下，請取代日期。  
![日期為 2021-03-23 的 S3 路徑反白顯示，以使用 參數取代。](http://docs.aws.amazon.com/zh_tw/databrew/latest/dg/images/dynamic-datasets-01.png)

1. 開啟**建立自訂參數**的內容 （按一下滑鼠右鍵） 選單，並為其設定屬性：
   + 名稱：報告日期
   + 類型：日期
   + 日期格式：yyyy-MM-dd （從預先定義的格式中選取）
   + 條件 （時間範圍）：過去 24 小時
   + 新增 為資料欄： true （已勾選）

   將其他欄位保留在其預設值。

1. 選擇**建立**。

完成後，您會看到更新的路徑，如下列螢幕擷取畫面所示。

![具有參數預留位置的 S3 路徑，顯示在儲存貯體中找到的 6 個相符檔案。](http://docs.aws.amazon.com/zh_tw/databrew/latest/dg/images/dynamic-datasets-02.png)


現在，您可以對國家/地區代碼執行相同的操作，並將其參數化，如下所示：
+ 名稱：國家/地區代碼
+ 類型：字串
+ 新增 為資料欄： true （已勾選）

如果所有值都相關，則不需要指定條件。例如，在 `new-cases` 資料夾中，我們只有具有國家/地區代碼的子資料夾，因此不需要條件。如果您有其他要排除的資料夾，您可以使用下列條件。

![字串值欄位包含 regex 模式 A-Z，後面接著括號中的 2。](http://docs.aws.amazon.com/zh_tw/databrew/latest/dg/images/dynamic-datasets-03.png)


此方法限制新案例的子資料夾包含兩個大寫拉丁字元。

在此參數化之後，您只有相符的資料集檔案，可以選擇**建立資料集**。

**注意**  
當您在條件中使用相對時間範圍時，載入資料集時會評估時間範圍。無論它們是預先定義的時間範圍，例如「過去 24 小時」或自訂時間範圍，例如「5 天前」，都是如此。此評估方法適用於互動式工作階段初始化期間或任務啟動期間載入的資料集。

選擇**建立資料集**後，您的動態資料集即可使用。例如，您可以先使用它來建立專案，並使用互動式 DataBrew 工作階段定義清除配方。然後，您可以建立排程每天執行的任務。此任務可能會在任務開始時，將清除配方套用至符合參數條件的資料集檔案。

### 動態資料集的支援條件
<a name="conditions.for.dynamic.datasets"></a>

您可以使用參數或上次修改的日期屬性來篩選相符的 S3 檔案。

您可以在下面找到每個參數類型的支援條件清單。


**與字串參數搭配使用的條件**  

| DataBrew SDK 中的名稱 | SDK 同義詞 | DataBrew 主控台中的名稱 | 說明 | 
| --- | --- | --- | --- | 
| 是 | 常數，== | 完全是 | 參數的值與條件中提供的值相同。 | 
| 不是 | not microSDHC，！= | Is not | 參數的值與條件中提供的值不同。 | 
| contains |  | Contains | 參數的字串值包含條件中提供的值。 | 
| 不包含 |  | 不包含 | 參數的字串值不包含條件中提供的值。 | 
| start\_with |  | 開頭為 | 參數的字串值以條件中提供的值開頭。 | 
| not start\_with |  | 開頭不是 | 參數的字串值開頭不是條件中提供的值。 | 
| end\_with |  | Ends with | 參數的字串值以條件中提供的值結尾。 | 
| not end\_with |  | 結尾不是 | 參數的字串值結尾不是條件中提供的值。 | 
| 相符項目 |  | 相符 | 參數的值符合條件中提供的規則表達式。 | 
| 不相符 |  | 不符合 | 參數的值不符合條件中提供的規則表達式。 | 

**注意**  
字串參數的所有條件都使用區分大小寫的比較。如果您不確定 S3 路徑中使用的案例，您可以使用「相符」條件搭配開頭為 的規則表達式值`(?i)`。這樣做會導致不區分大小寫的比較。  
例如，假設您希望字串參數以 開頭`abc`，但`Abc``ABC`也可以。在此情況下，您可以使用「相符」條件搭配 `(?i)^abc`做為條件值。


**與數字參數搭配使用的條件**  

| DataBrew SDK 中的名稱 | SDK 同義詞 | DataBrew 主控台中的名稱 | 說明 | 
| --- | --- | --- | --- | 
| 是 | 常數，== | 完全是 | 參數的值與條件中提供的值相同。 | 
| 不是 | not microSDHC，！= | Is not | 參數的值與條件中提供的值不同。 | 
| less\_than | lt、< | Less than | 參數的數值小於條件中提供的值。 | 
| less\_than\_equal | lte、<= | 小於或等於 | 參數的數值小於或等於條件中提供的值。 | 
| greater\_than | gt、> | Greater than | 參數的數值大於條件中提供的值。 | 
| greater\_than\_equal | gte，>= | 大於或等於 | 參數的數值大於或等於條件中提供的值。 | 


**與日期參數搭配使用的條件**  

| DataBrew SDK 中的名稱 | DataBrew 主控台中的名稱 | 條件值格式 (SDK) | 說明 | 
| --- | --- | --- | --- | 
| after | Start | ISO 8601 日期格式，例如 `2021-03-30T01:00:00Z`或 `2021-03-30T01:00-07:00` | 日期參數的值在條件中提供的日期之後。 | 
| before | 結束 | ISO 8601 日期格式，例如 `2021-03-30T01:00:00Z`或 `2021-03-30T01:00-07:00` | 日期參數的值在條件中提供的日期之前。 | 
| relative\_after | 開始 （相對） | 時間單位的正數或負數，例如 `-48h`或 `+7d`。 | 日期參數的值在條件中提供的相對日期之後。<br />載入資料集時，無論是初始化互動式工作階段或啟動相關聯的任務，都會評估相對日期。這是範例中稱為「現在」的時刻。 | 
| relative\_before | 結束 （相對） | 時間單位的正數或負數，例如 `-48h`或 `+7d`。 | 日期參數的值在條件中提供的相對日期之前。<br />載入資料集時，無論是初始化互動式工作階段或啟動相關聯的任務，都會評估相對日期。這是範例中稱為「現在」的時刻。 | 

如果您使用 SDK，請以下列格式提供相對日期：`±{number_of_time_units}{time_unit}`。您可以使用這些時間單位：
+ -1h (1 小時前）
+ \+2d （從現在起 2 天）
+ -120 公尺 (120 分鐘前）
+ 5000 秒 （從現在起 5，000 秒）
+ -3w (3 週前）
+ \+4M （從現在起 4 個月）
+ -1y (1 年前）

載入資料集時，無論是初始化互動式工作階段或啟動相關聯的任務，都會評估相對日期。這是上述範例中稱為「現在」的時刻。

### 設定動態資料集的設定
<a name="dynamic.datasets.configuration"></a>

除了提供參數化 S3 路徑之外，您還可以為具有多個檔案的資料集設定其他設定。這些設定會依其上次修改的日期篩選 S3 檔案，並限制檔案的數量。

與在路徑中設定日期參數類似，您可以在更新相符檔案時定義時間範圍，並僅將這些檔案包含在資料集中。您可以使用「2021 年 3 月 30 日」等絕對日期或「過去 24 小時」等相對範圍來定義這些範圍。

![使用過去 24 小時下拉式選單，指定上次選取的更新日期範圍核取方塊。](http://docs.aws.amazon.com/zh_tw/databrew/latest/dg/images/dynamic-datasets-04.png)


若要限制相符檔案的數量，請選取大於 0 的檔案數量，以及您想要最新或最舊的相符檔案。

![針對指定要包含最新下拉式清單和 10 個檔案的檔案數量選取核取方塊。](http://docs.aws.amazon.com/zh_tw/databrew/latest/dg/images/dynamic-datasets-05.png)
