AWS Glue クローラーはスキーマをどのように検出しますか?

最終更新日: 2021 年 8 月 27 日

私は AWS Glue クローラーを実行しています。クローラーは、スキーマが似ているにもかかわらず、複数のテーブルを作成しています。クローラーがスキーマを検出する方法を知りたいと考えています。

解決方法

AWS Glue クローラーを実行すると、クローラーは次の処理を実行します。

  1. データを分類する
  2. データをテーブルまたはパーティションにグループ化する
  3. AWS Glue データカタログにメタデータを書き込む

クローラーを実行したときに何が起こるか、およびクローラーがスキーマを検出する方法について知るには、以下を確認してください。

クローラーの定義

AWS Glue クローラーを定義するときに、スキーマを推測するためのデータの形式を評価する 1 つ以上のカスタム分類子を選択できます。クローラーが実行されると、リスト内の最初の分類子を使用してデータストアを正常に認識し、テーブルのスキーマを作成します。クローラーを定義する前に、カスタム分類子を定義します。クローラーが実行されると、クローラーは、定義したカスタム分類子を使用して、データストア内で一致を検索します。各分類子との一致により、確実性が生成されます。処理中に分類子が certy=1.0 を返す場合、クローラーは、分類子が正しいスキーマを作成できることが 100% 確実になります。この場合、クローラーは他の分類子の呼び出しを停止し、カスタム分類子に一致する分類子を含むテーブルを作成します。

AWS Glue が 100% の確実性で入力データ形式に適合するカスタム分類子を見つけられない場合、AWS Glue は組み込み分類子を呼び出します。組み込み分類子は、書式が一致する場合は certy=1.0、書式が一致しない場合は certy=0.0 を返します。certy=1.0 を返す分類子がない場合、AWS Glue は最も高い確実性を持つ分類子の出力を使用します。0.0 より高い確実性を返す分類子がない場合、AWS Glue はデフォルトの分類文字列である UNKNOWN を返します。AWS Glue の組み込み分類子の現在のリストと、それらが呼び出される順序については、「AWS Glue の組み込み分類子」を参照してください。

クローラーでのスキーマの検出

最初のクローラーの実行中に、クローラーは各ファイルの最初の 1,000 のレコードまたは最初のメガバイトを読み取り、スキーマを推測します。読み取られるデータの量は、ファイル形式と有効なレコードの可用性によって異なります。例えば、入力ファイルが JSON ファイルの場合、クローラーはファイルの最初の 1 MB を読み取り、スキーマを推測します。ファイルの最初の 1 MB 内で有効なレコードが読み取られると、クローラーはスキーマを推測します。クローラーが最初の 1 MB を読み取った後にスキーマを推測できない場合、クローラーはファイルを最大 10 MB まで読み取り、一度に 1 MB ずつ増分します。CSV ファイルの場合、クローラーは、最初に来るものが何であっても、最初の 100 レコードまたは最初の 1 MB のデータを読み取ります。Parquet ファイルの場合、クローラーはファイルから直接スキーマを推測します。クローラーは、すべてのサブフォルダとファイルから推測されたスキーマを比較し、1 つ以上のテーブルを作成します。クローラーがテーブルを作成するときは、次の要素を考慮します。

  • データの互換性: データの形式、圧縮タイプ、およびインクルードパスが同じかどうかをチェックする
  • スキーマの類似性: パーティションのしきい値と異なるスキーマの数に関してスキーマがどの程度類似しているかをチェックする

スキーマを類似と見なすには、次の条件が満たされている必要があります。

  • パーティションのしきい値が 0.7 (70%) よりも高くなっている。
  • 異なるスキーマ (このコンテキストでは「クラスター」とも呼ばれます) の最大数は 5 を超えません。

クローラーは、フォルダレベルでスキーマを推測し、すべてのフォルダ間でスキーマを比較します。比較されるスキーマが一致する場合、つまりパーティションのしきい値が 70% より高い場合、スキーマはテーブルのパーティションとして表示されます。一致しない場合、クローラーはフォルダごとにテーブルを作成し、テーブルの数の増加につながります。

サンプルシナリオ

例1: フォルダ DOC-EXAMPLE-FOLDER1 に 10 個のファイル、スキーマ SCH_A を持つ 8 つのファイル、および SCH_B を持つ 2 つのファイルがあるとします。

スキーマ 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 をクロールすると、クローラーは 1 つのテーブルを作成します。テーブルは、スキーマ SCH_A と SCH_B の両方の列で構成されます。これは、パス内のファイルの 80% が SCH_A スキーマに属し、ファイルの 20% が SCH_B スキーマに属しているためです。したがって、パーティションのしきい値は満たされます。また、異なるスキーマの数がクラスターの数を超えていないため、クラスターサイズの制限は超えていません。

例 2: フォルダ DOC-EXAMPLE-FOLDER2 に 10 個のファイル、スキーマ SCH_A を持つ 7 つのファイル、およびスキーマ SCH_B を持つ 3 つのファイルがあるとします。

クローラーが Amazon S3 パス s3://DOC-EXAMPLE-FOLDER2 をクロールすると、クローラーはファイルごとに 1 つのテーブルを作成します。これは、ファイルの 70% がスキーマ SCH_A に属し、ファイルの 30% がスキーマ SCH_B に属しているためです。これは、パーティションのしきい値が満たされていないことを意味します。Amazon CloudWatch でクローラーログをチェックして、作成されたテーブルに関する情報を取得できます。

クローラーオプション

  • 単一のスキーマを作成する: スキーマの類似性を無視し、スキーマを 1 つだけ作成するようにクローラーを構成するには、[S3 パスごとに単一のスキーマを作成する] オプションを使用します。詳細については、Amazon S3 インクルードパスごとに単一のスキーマを作成する方法を参照してください。ただし、クローラーがデータの非互換性を検出した場合でも、クローラーは複数のテーブルを作成します。
  • テーブルの場所を指定する: テーブルレベルのクローラーオプションを使用すると、テーブルの場所とパーティションの作成方法をクローラーに指示できます。テーブルレベルの値を指定すると、テーブルは Amazon S3 バケットからその絶対レベルで作成されます。コンソールでクローラーを設定するときに、[テーブルレベルクローラー] オプションの値を指定できます。値は、テーブルの場所 (データセット内の絶対レベル) を示す正の整数でなければなりません。最上位フォルダのレベルは 1 です。例えば、パス mydataset/a/b では、レベルが 3 に設定されている場合、テーブルは mydataset/a/b という場所に作成されます。詳細については、「テーブルの場所を指定する方法」を参照してください。

この記事は役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?