AWS re:Postを使用することにより、以下に同意したことになります AWS re:Post 利用規約

AWS Glue クローラーが複数のテーブルを作成するのを防ぐにはどうすればよいですか?

所要時間2分
0

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 データを使用するときは、常にヘッダーを使用してください。ヘッダーがあるファイルと、ヘッダーがないファイルがある場合、クローラーは複数のテーブルを作成します。


関連情報

AWS Glue での ETL 出力のパーティションの管理

クローラー設定オプションの設定

AWS公式
AWS公式更新しました 2年前