【AWS】Glue からクローリングして外部テーブルを作成する

■ はじめに

https://dk521123.hatenablog.com/entry/2019/12/01/003455

の続き。

今回は、Glue で作成したファイルを外部テーブルにする際に
得た知識・ノウハウをメモしておく。

軽く書くつもりが、結構なボリュームになってしまった、、、

目次

【1】Glue上での外部テーブル作成方法
 1)手順詳細
  A)クローリング作成手順
  B)クローリングの実行および確認方法
 2)Tips
  A)Include pathの指定について
  B)Excludeパターンの指定について
【2】Glue からクローリングして外部テーブルを作成する
【3】使用上の注意
 1)意図しないテーブルが生成する場合がある

【1】Glue上での外部テーブル作成方法

* Glue の Managementコンソールから外部テーブルを作成する方法は、
 以下の通り。

1)Add tables using a crawler
 ... クローラを使ってテーブル追加 ★今回★
2)Add table manually
 ... 手動でテーブル追加
3)Add table from existing schema
 ... 既存スキーマからテーブル追加

【2】Glue からクローリングして外部テーブルを作成する

大きな流れは以下の通り。
~~~~~
1)外部テーブル作成用のクローラを作成
2)1)のクローラを実行
~~~~~

以下「1)手順詳細」はその詳細。

1)手順詳細

A)クローリング作成手順

以下は、AWS Glue から S3上にあるファイル群をクローリングして
外部テーブルを作成する手順の一例である。

[1] AWS Managementコンソールにログインし、AWS Glue上まで飛ぶ

[2] 右ペインの[Databases]-[Tables]を選択

[3] [Add tables]-[Add tables using a crawler]を選択

[4] 以下のパートに分かれているので、それぞれ入力していく
 => 詰まったら、以下の公式サイトを確認しておくのもいいかも。

https://docs.aws.amazon.com/ja_jp/glue/latest/dg/define-crawler.html

 a) Crawler Info
  ... Crawler name などを入力していく
  => 任意のクローラ名を入力

 b) Crawler source type
  ... Crawler source type / Repeat crawls of s3 data stores を選択
  => 今回は、そのまま
  => ただし、以下「【3】使用上の注意」も参照した方がいい

 c) Data store
  ... Choose a data store を選択し、Include path/Exclude patternsを入力
  => 今回は、以下の通り。
  * Choose a data store:S3
  * Include path:「s3://your-bucket-name/xxxx/your-folder/」のように入力
  * Exclude patterns:空白
  ... 「Next」ボタン押下後に「Add another data store」が表示されるので、
   上記以外のパターンでクローリングしたい場合、「Yes」を選択

 d) IAM role
  ... クローリングする IAM role を選択
  => 既存のIAMロールを指定したい場合「Choose an existing IAM role」を選択

 e) Schedule
  ... Frequencyを選択
  => 今回の場合は、手動で開始したいので「Run on demand」を選択

 f) Output
  ... 出力先の Databaseを選択

 g) Review all steps
  ... 入力した内容を確認し「Finish」ボタン押下

B)クローリングの実行および確認方法

[1] AWS Glueの画面で左ペインの[Crawlers]を選択し、
 作成したCrawlerを選択した状態で、「Run crawler」ボタン押下
 => クローリングして終わったら
 「Tables added」に作成されたテーブル数が表示される

[2] 具体的に作成したテーブルを確認したい場合は「Logs」リンク押下

[ログの見方]
 a) 作成されている場合
  ... 「INFO : Created table 【テーブル名】 in database 【DB名】」のように表示

 b) 作成が除外されている場合
  ... 「INFO : Excluding : xxxxx/xxx.csv. Matches pattern: xxxx/**.csv」のように表示
 
c) パーティションが更新されている場合
  ... 「INFO : Created partitions with values [[【Partition】]] for table 【テーブル名】 in database 【DB名】」
  のように表示

[3] 最後に、Glueの画面の左ペイン [Databases]-[Tables]を選択し
 該当しているテーブルがあるかどうか確認する
 => テー部rが多い場合は、フィルタ機能(例えば「Database:【該当DB】」)
  を使うと確認しやすい

2)Tips

A)Include pathの指定について

* 以下の「【3】使用上の注意」の1)のように
 余計なテーブルができる可能性があるので、
 慣れるまで初めは、Include pathの指定を極力限定しておいた方がよさそう

B)Excludeパターンの指定について

* Exclude、つまり除外するパターンを指定する
 => 任意の入力なので、空欄でもクローラは作成できるので見逃してしまいがちだが
  クローリング対象が多岐に渡るのであれば指定した方がいい
* 以下の公式サイトは、例も載っているので一読しておくといい。

https://docs.aws.amazon.com/ja_jp/glue/latest/dg/define-crawler.html#crawler-data-stores-exclude

 => 公式サイトがとっつきづらい場合は、以下のサイトもある

https://dev.classmethod.jp/articles/20180712-aws-glue-using-exclude-pattern/

【3】使用上の注意

1)意図しないテーブルが生成する場合がある

クローリング後にテーブルを確認したところ、
ファイル名と同じようなテーブル(e.g. part_XXXX_XXXX_csv)が
意図していないのに、大量に生成されていた。

そこで、調べたところ、公式サイトの以下のページを見つけた。

AWS Glue クローラーが複数のテーブルを作成するのを防ぐにはどうすればよいですか?
https://aws.amazon.com/jp/premiumsupport/knowledge-center/glue-crawler-multiple-tables/

の「解決方法」を参照。

恐らくだが、原因は以下の項目で、
今回、クローリングしているのは、CSV形式のヘッダーなしのファイル。

「解決方法」より一部抜粋
https://aws.amazon.com/jp/premiumsupport/knowledge-center/glue-crawler-multiple-tables/

・CSV データを使用する場合は、
 一貫してヘッダーを使用していることを確認してください。
 ヘッダーがあるファイルと、ヘッダーがないファイルがある場合、
 クローラーは複数のテーブルを作成します。

補足

 ただ、「一貫してヘッダーなし」かつ、以下の設定をして、
再度クローリングしても、同じ現象になってしまうのだが、、、

ただ、ジョブ実行後のパーティション更新を行うだけなら、
以下の方法があるらしい。以下の関連記事にまとめた。

Glue Job から パーティションを更新することを考える
https://dk521123.hatenablog.com/entry/2021/05/15/130604

「解決方法」より一部抜粋
https://aws.amazon.com/jp/premiumsupport/knowledge-center/glue-crawler-multiple-tables/

[Configure the crawler's output] (クローラーの出力を設定) のページの
 [Grouping behavior for S3 data (optional)] (S3 データのグループ化動作 (任意)) で、
[Create a single schema for each S3 path] (S3 パスごとに単一のスキーマを作成する) を選択

関連記事

AWS Glue ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2019/10/01/221926
AWS Glue ~ 基本編 / クローラ ~
https://dk521123.hatenablog.com/entry/2019/12/01/003455
AWS Glue ~ Boto3 / クローラ編 ~
https://dk521123.hatenablog.com/entry/2021/04/16/135558
Glue から DataCatalogテーブル に対して Spark SQLを実行する
https://dk521123.hatenablog.com/entry/2021/05/11/220731
Hive / HiveQL ~ 基本編 / テーブル作成 ~
https://dk521123.hatenablog.com/entry/2020/11/03/000000
Glue Job から パーティションを更新することを考える
https://dk521123.hatenablog.com/entry/2021/05/15/130604