以前、Windowsバッチファイル上でCSVからParquet形式のデータに変換する で使用したParquet形式のファイルですが、実際にawsのAthena上でクエリできるでしょうか
aws athenaでは、csvファイル、parquetファイルは、圧縮形式に対応しているとのことで私は、gzip が都合が良いのでgzip形式での圧縮の実験をします。
当然比較のため無圧縮のファイルも準備します。
また、parquetファイルの中でgzip圧縮されたファイルとファイル自体をgzip圧縮したものそれぞれ用意しました。
これは、Athena上で書かれている圧縮がどの圧縮か判らなかったためそれも検証しました。
実験したのは、Windowsバッチファイル上でCSVからParquet形式のデータに変換する で作成した、ファイルを使用します。
csv2parquet --compression "gzip" "file.csv" "file1.parquet" で出来た file1.parquet ファイル
(gz圧縮parquetファイル)
csv2parquet "file.csv" "file2.parquet" で出来た file2.parquet ファイル
(無圧縮parquetファイル)
csv2parquet --compression "gzip" "file.csv" "file1.parquet" のあと
7zで 7z -agzip "file1.parquet.gz" "file1.parquet" を行い出来た file1.parquet.gz ファイル
(gz圧縮parquetファイル自体をさらにgzip圧縮したファイル)
csv2parquet "file.csv" "file2.parquet" のあと 7zで 7z -agzip "file2.parquet.gz" "file1.parquet" を行い出来た file2.parquet.gz ファイル
(無圧縮parquetファイル自体をgzip圧縮したファイル)
先に結果からいうと、1.と2.のファイルは、athenaのクエリで読み込みができました。
parquet形式のファイル自体をgzip圧縮したフィル3.と4は両社とも同じエラー(ファイルが破損しているとの)が出て読み込みができませんでした。
よって1.のgzip圧縮のParquetファイルが、Athenaでいうところの圧縮形式をサポートしているというものだということがわかりました。
まず、ファイルのアップロードについては、aws のコンソール画面のなかのs3の画面にて行いました。aws cli を用いてもアップロードできますが、視覚的にテストしやすかったので s3のコンソール画面とathena クエリのコンソール画面を開いて実験しました。
バケットの作成方法などは、理解しているものとして割愛します。
ほかの方々がわかりやすく解説しているサイトがたくさんありますのでそちらを見ていただいたほうが断然わかりやすいと思います。
私は、仕事上でしかathanaの環境がないためこちらではキャプチャ画面などなくわかりにくく申し訳ありませんが文章のみとなります。
実は、parquet形式のファイルをいくつか検証する際にathenaのクエリ上でトラブりました。
私は、Glueが使用できないのでathena上のコンソールでのクエリを記述するところでSQL文と打ち込んでテストしたのですが、CREATE TABLE は、すんなりできるのですが、データのプレビューをするとレコードが無い状態で返ってきます。
aws 内で検索すると いくつか原因が書いてあり どうもパーテーションの設定に問題がありそうでした。
パーティションについては、year=2020/month=1 というのを使用していましたのでその定義について認識できていないようでした。
aws 上に不具合の対策「空の結果を返す Amazon Athena クエリに関する問題を解決する 」が記されていましたのでもし同じ内容で悩んでおりましたら、
参照してみてください。
それが解決したと思ったら
次は、データの型が違うというのでエラーが返ってきてしまいました。
これには、対応の難しさがあります。
ファイルの内容は、上記の通り数値でしたが、クエリでは、文字として扱えば読込めるだろうと思い `年` string, `月` string …とすべて文字列扱いにしました。
すると全くデータが返ってこず、エラーが返ってきます。データ型がINT64で型が違うみたいな内容が返ってきます。
そもそもcsvファイル上でもデータ型の指定はされているわけでもないのでどのタイミングでデータ型が決まっているのでしょうか。
私は、CREATE TABLE の時にデータ型を入力できるのでそこで決めれると思っていました。 ですが、自動認識しているのか、「それはデータ型があっていない」と返ってくるのでフィールド数が増えた場合データ型をどうするかでドツボにハマりそうです。皆様も気を付けてください。