Tips

AWS Athenaのクエリーで取得できないデータがある

結論から申し上げますと

S3のファイル名の先頭が「.」(ドット/ピリオド)または「_」(アンダースコア/アンダーバー)だと隠しファイルとみなされて、クエリーで取得できません!

Athenaとは?

AthenaとはAWSのクエリーサービスで、AWS S3に置いたCSV、JSON、ORC、Parquetなどをデータベースとして扱い、SQLでデータ検索できるサーバーレスサービスです。

S3にファイルが確かにあるのに、Athenaのクエリー結果と件数が合わない事態が発生

S3に置いてあるJSON形式のファイルデータがあり、そのファイル名にはプログラムで生成したランダム文字列をつけていました。

1ファイルに1行のデータが入っていて、Athenaクエリーで全件取得してみたところ、S3のファイル数と結果行の数が合っていませんでした。数行たりない。

S3ファイルを確認してみると、先頭にアンダースコアが使用されたファイルが、問題の足りない行数分みつかりました。これは怪しい…。

そこで色々調べてみた所以下の事がわかりました。

隠しファイル

ファイル名がアンダースコア (\ _) またはピリオド (.) で始まっていないことを確認してください。

Athena はこれらのファイルをプレースホルダーと見なし、クエリを処理する際に無視します。詳細については、「Athena が隠しファイルを読み取れない」を参照してください。S3 パス内のすべてのファイルの名前がアンダースコアまたはピリオドで始まる場合、レコードはゼロになります。

**注:**S3 パスに、名前が異なる文字で始まるファイルのほかにプレースホルダーが含まれている場合、Athena はプレースホルダーのみを無視し、他のファイルにクエリを実行します。そのため、1 つ以上のレコードを取得できます。

例:
s3://doc-example-bucket/athena/inputdata/_file2
s3://doc-example-bucket/athena/inputdata/.file2

ファイル名を変えてみたら、ちゃんと全件取得できました。

「.」ドットの隠しファイルはなんとなく読まなそうだなぁという感じはありますが、アンダースコアもだったとは。

勉強になりました。

 

 

reiko suzuki
OLD SKOOLシステムエンジニア。ねこを撫でながら働いています。