■ はじめに
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