AWS re:Postを使用することにより、以下に同意したことになります 利用規約

Amazon Athena テーブルに対してクエリを実行するときにゼロ個のレコードが返されるのはなぜですか?

所要時間2分
0

予期される列とそれらのデータ型を使用して、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 つ、または複数のレコードが返される可能性があります。


関連情報

Athena でテーブルを作成する

AWS Glue クローラの使用

AWS公式
AWS公式更新しました 2年前