AWS Glue クローラーが複数のテーブルを作成するのを防ぐにはどうすればよいですか?
AWS Glue クローラーがソースデータから複数のテーブルを作成するのはなぜですか? また、これを防ぐにはどうすればよいですか?
簡単な説明
最初の AWS Glue クローラーの実行中に、クローラーは各ファイルの最初の 1,000 のレコードまたは最初のメガバイトを読み取ります。これはスキーマを推測するために行われます。クローラーが読み取るデータの量は、ファイル形式と有効なレコードの可用性によって異なります。
例えば、入力ファイルが JSON ファイルの場合、クローラーはファイルの最初の 1 MB を読み取り、スキーマを推測します。ファイルの最初の 1 MB 内で有効なレコードが読み取られると、クローラーはスキーマを推測します。クローラが最初の 1 MB を読み取った後にスキーマを推測できない場合、最大で 10 MB のファイルを読み取ります。これは 1 MB 単位で行われます。
CSV ファイルの場合、クローラーは、最初に来るものが何であっても、最初の 1000 レコードまたは最初の 1 MB のデータを読み取ります。Parquet ファイルの場合、クローラーはファイルから直接スキーマを推測します。
クローラーは、すべてのサブフォルダとファイルから推測されたスキーマを比較し、1 つ以上のテーブルを作成します。
ソースデータファイルが以下について同じものを使用していない場合、AWS Glue クローラーは複数のテーブルを作成します。
- 形式 (CSV、Parquet、JSON など)
- 圧縮タイプ (SNAPPY、gzip、bzip2 など)
- スキーマ
- Amazon Simple Storage Service (Amazon S3) パーティションの構造
解決方法
クローラーのログを確認する
クローラーのログを確認して、クローラーが複数のテーブルを作成する原因となっているファイルを特定します。
1. AWS Glue コンソールを開きます。
2. ナビゲーションペインで、[クローラー] を選択します。
3. ログを確認するクローラを選択します。
4. [Logs] リンクを選択して、Amazon CloudWatch コンソールでログを表示します。
5. 前回のクローラーの実行中に AWS Glue が複数のテーブルを作成した場合、ログには次のようなエントリが含まれます。
[439d6bb5-ce7b-4fb7-9b4d-805346a37f88] INFO : Created table 2_part_00000_24cab769_750d_4ef0_9663_0cc6228ac858_c000_snappy_parquet in database glue
[439d6bb5-ce7b-4fb7-9b4d-805346a37f88] INFO : Created table 2_part_00000_3518b196_caf5_481f_ba4f_3e968cbbdd67_c000_snappy_parquet in database glue
[439d6bb5-ce7b-4fb7-9b4d-805346a37f88] INFO : Created table 2_part_00000_6d2fffc2_a893_4531_89fa_72c6224bb2d6_c000_snappy_parquet in database glue
ログエントリには、クローラーが複数のテーブルを作成する原因となっているファイルの名前が含まれます。
複数のテーブルの作成を防ぐ
複数のテーブルが作成されないようにするには、次のいずれかの操作を行います。
すべてのデータファイルが同じスキーマ、形式、および圧縮タイプを使用していることを確認する
場合によっては、ファイルは異なるスキーマを使用します。例えば、スキーマ A ではフィールド X が INT 型で、スキーマ B ではフィールド X が BOOL 型であると言う場合があります。このユースケースでは、次のいずれかのアクションを実行してください。
- from_options 関数を使用して AWS Glue の抽出、変換、ロード (ETL) ジョブを実行し、外れ値データを読み取ります。次に、外れ値データ型をソース内の正しいデータ型または最も一般的なデータ型に変換します。
- Amazon Athena で既存のテーブル DDL を使用してテーブルを手動で作成します。次に、AWS Glue クローラを実行してテーブルのメタデータを更新します。クローラー設定を使用して、テーブルからスキーマを継承します。
クローラーを作成する際は、互換性のあるスキーマを組み合わせる
クローラーは、フォルダレベルでスキーマを推測し、すべてのフォルダ間でスキーマを比較します。クローラーは、スキーマが一致しているかどうか、およびパーティションのしきい値が 70% を超えているかどうかを確認します。一致する場合、スキーマはテーブルのパーティションとして示されます。一致しない場合、クローラーはフォルダごとにテーブルを作成し、テーブルの数の増加につながります。
入力ファイルによっては、データのスキーマが異なり、他のファイルでも同様のスキーマが使用されている場合があります。クローラーを作成するときに、互換性のあるスキーマを組み合わせることができます。[Configure the crawler's output] ページの [Grouping behavior for S3 data(optional)] で、[Create a single schema for each S3 path] を選択します。この設定が有効で、データに互換性がある場合、クローラーは、パス内の Amazon S3 オブジェクトを評価するときに、スキーマの類似性を無視します。
詳細については、「Amazon S3 インクルードパスごとに 1 つのスキーマを作成する方法」を参照してください。
入力ファイルの Amazon S3 パスが異なっていないか確認する
Amazon S3 プレフィックス内の構造に一貫性がない場合、クローラーは個々のパスを個別のテーブルと見なします。次に、クローラーは複数のテーブルを作成します。入力ファイルで Amazon S3 の構造/パスが異なっている場合、クローラーは複数のテーブルを作成します。これはクローラーのデフォルトの動作です。
例えば、クローラーが次のようなパーティション構造で S3 パス s3://doc-example-bucket/doc-example-key/doc-example-table をクロールするとします。
- s3://doc-example-bucket/doc-example-key/doc-example-table/dt=2020-08-20/doc-example-file1.csv
- s3://doc-example-bucket/doc-example-key/doc-example-table/dt=2020-08-21/dox-example-file2.csv
- s3://doc-example-bucket/doc-example-key/doc-example-table/dt=2020-08-22/doc-example-file3.csv
上記の 3 つのファイルに、次のファイルを追加します。
- s3://doc-example-bucket/doc-example-key/doc-example-table/dox-example-file4.csv
- s3:// doc-example-bucket/doc-example-key/doc-example-table/doc-example-file5.csv
次に、クローラーは、別のクローラー実行で 5 つの個別のテーブルを作成します。これは、フォルダーのパーティション構造に一貫性がないために起こります。
この問題を回避するには、以下のベストプラクティスを確認してください。
- 手動またはプログラムでスキーマの一貫性を保ちます。この例では、パーティション dt=xxx-xxx-xx なしで S3 ファイルを削除するか、ファイル doc-example-file4.csv および doc-example-file5.csv のパーティションを追加することができます。
- 除外パターンを使用して、不要なファイルやフォルダを除外します。
一貫性のあるヘッダーを使用する
CSV データを使用するときは、常にヘッダーを使用してください。ヘッダーがあるファイルと、ヘッダーがないファイルがある場合、クローラーは複数のテーブルを作成します。
関連情報
関連するコンテンツ
- 質問済み 1年前lg...
- 質問済み 1年前lg...
- 質問済み 2年前lg...
- 質問済み 1ヶ月前lg...
- AWS公式更新しました 3年前
- AWS公式更新しました 3年前
- AWS公式更新しました 2年前
- AWS公式更新しました 3年前