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

最終更新日: 2018 年 9 月 17 日

Amazon Athena で、列とそれに含まれるべきデータタイプを指定しながら CREATE TABLE ステートメントを実行しました。しかし、クエリの select * from <table-name>, を実行すると、出力は Zero records returned になります。

解決方法

クエリがゼロ個のレコードを返す可能性がある一般的な理由を次に示します。

クローラ設定で対象をファイルに指定している

クローラを使用している場合は、クローラがファイルではなく Amazon Simple Storage Service(Amazon S3) バケットを指すようにします。

不正な LOCATION パス

入力データのための、Amazon S3 におけるLOCATION パスを 確認します。入力データの LOCATION パスが正しくない場合、Athena はレコード数としてゼロを返します。

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

テーブルでパーティションを定義した場合でも、そのパーティションが、AWS Glue データカタログ、または内部的な Athena データカタログにロードされていない可能性があります。Athena は on-read 時にスキーマを適用するため、メタデータの作成は、作成済みのテーブルがある場合にのみ行われます。データが解析されるのは、クエリの実行時のみです。そのデータが指定された場所にまだ配置されていない場合、Athena はレコード数にゼロを返します。パーティションが CREATE TABLE ステートメントで定義されている場合は、 MSCK REPAIR TABLE または ALTER TABLE ADD PARTITION コマンドを使用してパーティション情報をカタログにロードします。

MSCK REPAIR TABLE

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

  • s3://mybucket/athena/inputdata/year=2016/data.csv
  • s3://mybucket/athena/inputdata/year=2015/data.csv
  • s3://mybucket/athena/inputdata/year=2014/data.csv

Athena で想定する通りの S3 パスにデータが置かれている場合は、次のようなコマンドを実行してテーブルを修復します。

CREATE EXTERNAL TABLE Employee (
    Id INT,
    Name STRING,
    Address STRING
) PARTITIONED BY (year INT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION 's3://mybucket/athena/inputdata/';

テーブルの作成が完了したら、次のようなコマンドを実行してパーティション情報をロードします。

MSCK REPAIR TABLE Employee;

データがロードされると、クエリ select * from <table-name> はデータを返すようになります。

ALTER TABLE ADD PARTITION

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

  • s3://mybucket/athena/inputdata/2016/data.csv
  • s3://mybucket/athena/inputdata/2015/data.csv
  • s3://mybucket/athena/inputdata/2014/data.csv

こういったパスの場合には、次のようなコマンドを実行します。

ALTER TABLE Employee ADD
    PARTITION (year=2016) LOCATION 's3://mybucket/athena/inputdata/2016/'
    PARTITION (year=2015) LOCATION 's3://mybucket/athena/inputdata/2015/'
    PARTITION (year=2014) LOCATION 's3://mybucket/athena/inputdata/2014/'

データがロードされた後、クエリ select * from <table-name> を実行すると、データが返されます。


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

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


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