パーティションが定義済みの Amazon Athena でテーブルを作成しましたが、テーブルをクエリすると、レコード数としてゼロが返されます。

最終更新日: 2020 年 4 月 7 日

予期される列とそのデータ型を使用して、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://awsexamplebucket/myprefix//input//

この問題を解決するには、ダブルスラッシュがない場所にファイルをコピーします。AWS コマンドラインインターフェイス (AWS CLI) のサンプルコマンド:

aws s3 cp s3://awsexamplebucket/myprefix//input// s3://awsexamplebucket/myprefix/input/ --recursive

パーティションのロードが完了していない

Athena は、テーブルの作成時にのみメタデータを作成します。データが解析されるのは、クエリの実行時のみです。テーブルでパーティションを定義した場合でも、そのパーティションが、AWS Glue データカタログ、または内部的な Athena データカタログにロードされていない可能性があります。[MSCK REPAIR TABLE ] または [ALTER TABLE ADD PARTITION ] を使用して、パーティション情報をカタログにロードします。

MSCK REPAIR TABLE

パーティションが Athena でサポートされている形式で保存されている場合は、MSCK REPAIR TABLE を実行して、パーティションのメタデータをカタログにロードします。たとえば、[Year] でパーティショニングされたテーブルがある場合、Athena では次のような Amazon S3 パスでデータが見つかることを想定します。

  • s3://awsexamplebucket/athena/inputdata/year=2020/data.csv
  • s3://awsexamplebucket/athena/inputdata/year=2019/data.csv
  • s3://awsexamplebucket/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://awsexamplebucket/athena/inputdata/';

テーブルが作成されたら、パーティション情報をロードします。

MSCK REPAIR TABLE Employee;

データがロードされたら、SELECT * FROM table-name クエリを再度実行します。

ALTER TABLE ADD PARTITION

パーティションが Athena がサポートする形式で保存されていない場合、または異なる Amazon S3 パスに置かれている場合は、パーティションごとに ALTER TABLE ADD PARTITION を実行します。たとえば、データが次のような Amazon S3 パスにあるとします。

  • s3://awsexamplebucket/athena/inputdata/2020/data.csv
  • s3://awsexamplebucket/athena/inputdata/2019/data.csv
  • s3://awsexamplebucket/athena/inputdata/2018/data.csv

これらのパスで、次のようなコマンドを実行します。

ALTER TABLE Employee ADD
    PARTITION (year=2020) LOCATION 's3://awsexamplebucket/athena/inputdata/2020/'
    PARTITION (year=2019) LOCATION 's3://awsexamplebucket/athena/inputdata/2019/'
    PARTITION (year=2018) LOCATION 's3://awsexamplebucket/athena/inputdata/2018/'

データがロードされたら、SELECT * FROM table-name クエリを再度実行します。


この記事はお役に立ちましたか?

改善できることはありますか?


さらにサポートが必要な場合