AWS athenaでのテーブルのプレビュー結果がzero recordになった時


はじめに

Glue catalogに作成されたテーブルをAthenaで確認する際、テーブルの中身は表示されず以下のようなメッセージが出力される場合があります。

Crawlerのパスもうまく設定したのに、中身がないと表示されるだけで原因について教えてくれないため、この現象を解決するのに時間がかかり苦労するケースがあります。

この記事では

  • なぜzero record状態が起こるのか
  • 解決方法は何か

について説明したいと思います。

なぜzero record状態が起こるのか

Crawlerを回す際、Crawlerはパス内のデータの隙間の類似性を下に1つのテーブルを作成して返します。
この場合、Crawlerの実行のリソースとして作られるテーブルがzero recordになる原因は、パスの中の複数のファイルが持つスキーマがそれぞれ違うっていうことになります。

スキーマとは?

スキーマとは、データの構造、性質や他のデータとの関連、データベースを操作する時のルールや表現法などを定義したもののことです。
(詳細はこちらをご参照ください。)
つまり、「スキーマが違う」というのは、それぞれのデータが持っている内容が違うことを意味します。

1つのパスの中に違うスキーマのデータがある時、
Cralwerはどこを基準に1つに合わせたらいいかの判断ができないため、空のテーブルを返すと思われます。

まずチェックするもの


Cralwerの設定画面で、「S3パスごとに単一の」スキーマを作成する」にチェックが外されているかを確認してください。
後ほど説明いたしますが、この項目にチェックされていると、実際作りたいテーブルと違うスキーマを持つテーブルが作られるため、基本的にはチェックを外して使用することをおすすめします。

解決方法

ここからは、zero recordの現象を解決するための方法をいくつか紹介したいと思います。

方法①

  • 同一パスにい入っているデータソースファイルを加工してS3バケットに入れ直す方法になります
    • データのスキーマが一致することが重要
    • スキーマの完全一致とは「データの構造が同じ」な状態を意味する カラム名、カラムの数、カラムのデータ型が全部一致

例えば、

order_list1.csv

customer item price count date
Tom aa 1000 20 2020-02-01
John bb 2000 45 2020-02-01
Jane cc 3000 3 2020-02-01
Amy dd 5000 16 2020-02-01

order_list2.csv

customer item price count date
Tom dd 4000 25 2020-03-01
David ee 6000 30 2020-03-01
Judy bb 2000 5 2020-03-01
Smith ff 1500 50 2020-03-01
Amy cc 3000 35 2020-03-01

上記のようにスキーマが完全一致する場合、Glue crawlerが自動で1つのテーブル化してcatalogに追加してくれますので、zero recordはもう発生しなくなります。

方法②

「カラム名&カラムの数が一致するか?」の基準にs3パスを分ける方法です
例えば、

order_list.csv

customer item price count date
Tom aa 1000 20 2020-02-01
John bb 2000 45 2020-02-01
Jane cc 3000 3 2020-02-01
Amy dd 5000 16 2020-02-01

stock_list.csv

item count
aa 25
bb 10
cc 5
dd 50
ee 35

order_listとstock_list単一のテーブルに併合させる必要がないため、
S3パスを分けて登録することで、それぞれ別のパスで指定すると、2つのテーブルを分けて作成できます。

今回の場合、

s3://(bucket名)/(folder名)/order_list.csv
s3://(bucket名)/(folder名)/stock_list.csv

をそれぞれ追加すると、order_listとstock_listは別々のテーブルとして作成されます。

方法③

cralwerの設定を変更して無理やり合わせる方法もあります。

この方法は、さっきチェックを外した 「S3パスごとに単一のスキーマを作成する」を再度チェックだけでOKです。

注意事項

このオプションで作られたテーブルは元のファイルとは違うカラム情報を持ってる可能性が非常に高いです。

  • 同一カラムにも違う内容が入ったり
  • 意図したように統合されない可能性も高いです

ので、基本オプションは「チェックを外すこと」をおすすめします。

結論

Glue CrawlerでGlue catalogにテーブルを追加する際は
1つのS3パスに入ってるパスは同じスキーマを持つ入るように設定することに気をつけましょう。