Amazon Athena テーブルに対してクエリを実行するときにゼロ個のレコードが返されるのはなぜですか?
予期される列とそれらのデータ型を使用して、Amazon Athena で CREATE TABLE ステートメントを実行しました。SELECT * FROM table-name クエリを実行すると、出力が「Zero records returned.」になります。
解決方法
クエリがゼロ個のレコードを返す場合がある一般的な原因は以下のとおりです。
クローラ設定で選択されているファイル
クローラを使用している場合は、クローラのポイント先がファイルではなく Amazon Simple Storage Service (Amazon S3) バケットであることを確認します。
LOCATION パスが正しくない
入力データの Amazon S3 LOCATION パスを確認します。入力の LOCATION パスが正しくない場合、Athena はゼロ個のレコードを返します。
LOCATION パスにダブルスラッシュがある
Athena では、ダブルスラッシュ (//) を含むテーブルロケーションパスはサポートされていません。例えば、次の LOCATION パスは空の結果を返します。
s3://doc-example-bucket/myprefix//input//
この問題を解決するには、ダブルスラッシュがない場所にファイルをコピーします。以下は、これを行うための AWS Command Line Interface (AWS CLI) コマンドの例です。
aws s3 cp s3://doc-example-bucket/myprefix//input// s3://doc-example-bucket/myprefix/input/ --recursive
注意: AWS CLI コマンドの実行時にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください。
同じ S3 プレフィックスに格納された複数のテーブルのデータ
Glue クローラは、同じ S3 プレフィックスに格納されているデータ用に別々のテーブルを作成します。ただし、Athena でこれらのテーブルに対してクエリを実行すると、レコードはゼロになります。
例えば、テーブルの場所が次のようになっている場合、Athena クエリはゼロ個のレコードを返します。
- s3://doc-example-bucket/table1.csv
- s3://doc-example-bucket/table2.csv
この問題を解決するには、個々のテーブルに対して次のような S3 プレフィックスを作成します。
- s3://doc-example-bucket/table1/table1.csv
- s3://doc-example-bucket/table2/table2.csv
その後、次のようなクエリを実行して、テーブル table1 の場所を更新します。
ALTER TABLE table1 SET LOCATION 's3://doc-example-bucket/table1';
パーティションがまだロードされていない
Athena がメタデータを作成するのは、テーブルが作成されるときのみです。データが解析されるのは、クエリの実行時のみです。テーブルに定義済みのパーティションがある場合は、これらのパーティションが AWS Glue データカタログ、または Athena 内のデータカタログにロードされていない可能性があります。MSCK REPAIR TABLE または ALTER TABLE ADD PARTITION を使用して、パーティション情報をカタログにロードします。
MSCK REPAIR TABLE: パーティションが Athena 対応の形式で保存されている場合は、MSCK REPAIR TABLE を実行してパーティションのメタデータをカタログにロードします。例えば、テーブルが Year でパーティション化されている場合、Athena は次のような Amazon S3 パスにデータがあることを期待します。
- s3://doc-example-bucket/athena/inputdata/year=2020/data.csv
- s3://doc-example-bucket/athena/inputdata/year=2019/data.csv
- s3://doc-example-bucket/athena/inputdata/year=2018/data.csv
Athena が期待している Amazon S3 パスにデータがある場合は、次のようなコマンドを実行してテーブルを修復します。
CREATE EXTERNAL TABLE Employee ( Id INT, Name STRING, Address STRING ) PARTITIONED BY (year INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION 's3://doc-example-bucket/athena/inputdata/';
テーブルが作成されたら、パーティション情報をロードします。
MSCK REPAIR TABLE Employee;
データがロードされたら、次のクエリを再度実行します。
SELECT * FROM Employee;
ALTER TABLE ADD PARTITION: パーティションが Athena 対応の形式で保存されていない場合、または異なる Amazon S3 パスに置かれている場合は、パーティションごとに ALTER TABLE ADD PARTITION を実行します。例えば、データが次の Amazon S3 パスにあるとします。
- s3://doc-example-bucket/athena/inputdata/2020/data.csv
- s3://doc-example-bucket/athena/inputdata/2019/data.csv
- s3://doc-example-bucket/athena/inputdata/2018/data.csv
こういったパスの場合には、次のようなコマンドを実行します。
ALTER TABLE Employee ADD PARTITION (year=2020) LOCATION 's3://doc-example-bucket/athena/inputdata/2020/' PARTITION (year=2019) LOCATION 's3://doc-example-bucket/athena/inputdata/2019/' PARTITION (year=2018) LOCATION 's3://doc-example-bucket/athena/inputdata/2018/'
データがロードされたら、次のクエリを再度実行します。
SELECT * FROM Employee;
Hive の隠しファイル
ファイル名がアンダースコア (_) またはドット (.) で始まっていないことを確認します。
例:
- s3://doc-example-bucket/athena/inputdata/_file1
- s3://doc-example-bucket/athena/inputdata/.file2
S3 パスにあるファイルにアンダースコアまたはドットで始まる名前が付けられている場合、Athena はこれらのファイルをプレースホルダーと見なします。Athena は、クエリを処理するときにこれらのファイルを無視します。詳細については、「Athena が隠しファイルを読み取ることができない」を参照してください。S3 パス内のすべてのファイルにアンダースコアまたはドットで始まる名前が付けられている場合は、ゼロ個のレコードが返されます。
注意: S3 パスの中にプレースホルダーと異なる文字で始まる名前が付けられたファイルがある場合、Athena はプレースホルダーのみを無視し、他のファイルをクエリします。このため、1 つ、または複数のレコードが返される可能性があります。
関連情報
関連するコンテンツ
- 質問済み 4年前lg...
- 質問済み 4年前lg...
- 質問済み 3年前lg...
- 質問済み 3年前lg...
- 質問済み 5年前lg...
- AWS公式更新しました 2年前
- AWS公式更新しました 2年前