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パスに入ってるパスは同じスキーマを持つ入るように設定することに気をつけましょう。
Author And Source
この問題について(AWS athenaでのテーブルのプレビュー結果がzero recordになった時), 我々は、より多くの情報をここで見つけました https://qiita.com/hoi_my_/items/c01de3109d72a2e34f6b著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .