當我執行 AWS Glue 編目程式時,編目程式會建立多個結構描述看起來相似的資料表。我想知道編目程式如何偵測結構描述。
解決方法
編目程式中的結構描述偵測
在第一次執行編目程式期間,編目程式會讀取每個檔案的前 1,000 筆記錄或前 1 MB,以推斷結構描述。編目程式讀取的資料量取決於檔案格式和有效記錄的可用性。例如,如果輸入檔案是 JSON 檔案,則編目程式會讀取檔案的前 1 MB 來推斷結構描述。
如果編目程式在檔案前 1 MB 內讀取到有效記錄,則編目程式會推斷結構描述。如果編目程式在 1 MB 之後仍無法推斷結構描述,則會以每次 1 MB 的增量持續讀取檔案,最多讀取到 10 MB。
對於 CSV 檔案,編目程式會讀取前 1000 筆記錄或前 1 MB 的資料,以先到者為準。對於 Parquet 檔案,編目程式會直接從檔案推斷結構描述。編目程式會比較從所有子資料夾和檔案推斷出的結構描述,然後建立一個或多個資料表。
當編目程式建立資料表時,編目程式會考量以下因素:
- 資料是否具有相同的格式、壓縮類型和包含路徑
- 結構描述在分區閾值和不同結構描述數量上的相似程度
若要讓編目程式判定結構描述相似,則必須符合下列條件:
- 分區閾值高於 0.7 (70%)。
- 不同結構描述的最大數量 (在此情境中也稱為「叢集」) 不得超過 5。
編目程式會在資料夾層級推斷結構描述,並比較所有資料夾中的結構描述。如果比較的結構描述相符,且分區閾值高於 70%,則編目程式會將這些結構描述標示為資料表的分區。如果不相符,則編目程式會為每個資料夾建立一個資料表,因而產生較多資料表。
範例情境
範例 1
在以下範例中,資料夾 DOC-EXAMPLE-FOLDER1 有 10 個檔案,其中 8 個檔案的結構描述為 SCH_A,2 個檔案的結構描述為 SCH_B。
結果會類似下列範例:
SHC_A:
{ "id": 1, "first_name": "John", "last_name": "Doe"}{ "id": 2, "first_name": "Li", "last_name": "Juan"}
SCH_B:
{"city":"Dublin","country":"Ireland"}{"city":
"Paris","country":"France"}
當編目程式編目 Amazon Simple Storage Service (Amazon S3) 路徑 s3://DOC-EXAMPLE-FOLDER1 時,編目程式會建立一個資料表,資料表包含結構描述 SCH_A 和 SCH_B 的資料欄。這是因為路徑中有 80% 的檔案屬於結構描述 SCH_A,20% 的檔案屬於結構描述 SCH_B。由此可得,結構描述符合分區閾值。此外,不同結構描述的數量不會超過叢集數量,且結構描述不會超過叢集大小限制。
範例 2
在以下範例中,資料夾 DOC-EXAMPLE-FOLDER2 有 10 個檔案,其中 7 個檔案的結構描述為 SCH_A,3 個檔案的結構描述為 SCH_B。
當編目程式編目 Amazon S3 路徑 s3://DOC-EXAMPLE-FOLDER2 時,編目程式會為每個檔案建立一個資料表。這是因為 70% 的檔案屬於結構描述 SCH_A,而 30% 的檔案屬於結構描述 SCH_B,由此可得,結構描述不符合分區閾值。
注意: 若要取得有關資料表的資訊,請檢查 Amazon CloudWatch 中的編目程式日誌。
編目程式選項
當您自訂編目程式行為時,可以選擇以下其中一個選項:
- 使用 Create a single schema for each S3 path (為每個 S3 路徑建立單一結構描述) 選項,將編目程式設定為忽略結構描述相似性並建立單一結構描述。
注意: 如果編目程式偵測到資料不相容,則編目程式仍會建立多個資料表。
- 請使用資料表層級編目程式選項指定資料表所在位置,以及編目程式建立分區的方式。
相關資訊
Using crawlers to populate the Data Catalog (使用編目程式填入 Data Catalog)
Customizing crawler behavior (自訂編目程式行為)
Defining and managing classifiers (定義與管理分類器)