go-athenaにResult Modeを設けたので記載します。
GetQueryResult APIアクセスはクエリ結果を全件取得するためには取得レコード件数によっては複数回アクセスする場合もありました。Athenaにはクエリ結果をファイルダウンロードする機能やCTASテーブルを作成・閲覧する機能があるのでそれらを使用してクエリの実行結果を取得するためにResultモードを設けました。
アプリケーションからAthenaにクエリを投げてクエリの結果を取得するのに大きく2種類のAPIコールが必要です。
- クエリの実行
- クエリの実行した結果(SELECT文のRows)を取得
Get Result部分は元々 go-athena ではアクセスのみでしたが、下記のようにDLモードとGZIP DLモードを設けました
- APIモード(default)
- DLモード
- GZIP DLモード
ただし、DLモード、GZIP DLモードはSelect文でのみ使用可能です
結果取得に GetQueryResults API にアクセスして結果を取得します。 このAPIアクセスはクエリ結果をAPIで返す場合はレスポンスで返せる件数に制限があります。クエリ結果が 最大件数(最大1000件) を超える場合は複数回のAPIアクセスにて全クエリ結果を取得します。
Athenaはクエリ結果の全件をcsvファイル保存しておりますので、それをダウンロード取得することが可能です。 csvファイルは無圧縮です。 ファイルダウンロードによりクエリ結果を件数に関係なく1APIアクセスで取得できます。
- 注意
- Select文でしか使用できません。
DLモードのcsvファイルは無圧縮のファイルダウンロードでした。 CTASテーブルを使用する事によりダウンロードファイルをgzipに圧縮することが可能です。
- クエリによるCTASテーブル作成(GZIP指定)
- CTASテーブルデータのダウンロード・解凍
- CTASテーブルを削除
- 注意
- Select文でしか使用できません。
- カラムの型が他の2タイプと若干異なります。
Result Mode | How to get column type | Column | Column | Column |
---|---|---|---|---|
API, DL | ResultSet.ResultSetMetadata.ColumnInfo.Type | varchar | integer | demical |
GZIP DL | TableMetadata.Columns.Type | string | int | demical(numner, numner) |
クエリ実行から結果全件取得までかかった時間の比較です。
下記の傾向が言えるかと思います
- 少量の件数ではDLモード、APIモードが有効
- 大量の件数ではGZIP DLモードが非常に有効