Amazon AthenaとYellowfinでS3にあるCSVファイルを可視化する

Yellowfin 8.0.2では[Amazon Athenaが正式にサポート](https://yellowfin.co.jp/blog/2019/07/17-blog1)されました。この機能を使えば、Amazon S3に保管されたデータを容易に分析することができます。
この記事では、簡単なCSVのファイルを例として、Yellowfin＋Athena＋S3を連携する手順をご紹介します。

# Amazon Athenaとは
Amazon Athenaは標準SQLを使用してAmazon S3内のデータを直接、簡単に分析できるようにするインタラクティブなクエリサービスです。
CSV、JSON、ORC、Avro、Parquetといったさまざまなデータ形式がサポートされており、AthenaのJDBCドライバーを使用して、さまざまなBIツールからAthenaに接続することもできます。
![image-c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/d2740bfe-09e0-1b5f-db75-6da41b8e74bc.png)

つまり、上図のようにAthenaを中継することによって、S3のファイルをわざわざDBに取り込まなくてもYellowfinの分析対象としてしまえるのです。

# Amazon Athenaを使ってみる

それではAthenaを実際に使ってみましょう。やることはざっくり以下の4つです。

* IAMで権限のあるアクセスキーを作成する
* S3にファイルを置く
* Athenaにテーブルを作る
* Yellowfin（BIツール）のデータソースを設定する

## IAMで権限のあるアクセスキーを作成する

まず、S3とAthenaへのアクセス権を割り当てます。とりあえず細かいことは考えずに動かしてみたいので、どちらもフルアクセスを直接アタッチしました。
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/a447e6e4-9ecd-d537-e1f2-bfa555a31147.png)

そして、アクセスキーを作成します。**アクセスキーID**と**シークレットアクセスキー**は後で必要になるので、手元にコピーしておきます。

![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/db61a58f-1125-aacd-1596-969036f9d392.png)

## S3にファイルを置く

Amazon S3にファイルを配置します。
今回はKaggleで公開されている[ユニクロ（ファーストリテイリング）の2010年から2016年の株価データ](https://www.kaggle.com/daiearth22/uniqlo-fastretailing-stock-price-prediction)をサンプルとして使用します。

S3にバケット、フォルダを作成し、CSVファイルを配置します。
ただ、ダウンロードしたCSVファイルはそのまま使わず、**ヘッダー行の除去**を行っています。Athenaを使う場合、こうした前処理は[AWS Glue](https://aws.amazon.com/jp/glue/)などのETLで事前に済ませておく必要があります。なお、今回は手作業で除去しました。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/63d3a531-716a-87bd-eda3-48cc908f7e25.png)

配置したフォルダのパス（s3://バケット名/フォルダ名/〜）が後で必要になりますので、手元にコピーしておいてください。

## Athenaにテーブルを作る

Athenaのサービス画面のトップにある「Get Started」をクリックします。
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/66b61a0e-7ee2-e13d-b2c8-53ca55a47cda.png)

このメッセージが出ているときは、クエリの実行結果の出力先を事前に設定する必要があります。リンクをクリックして、出力先にするS3のフォルダを指定してください。とりあえず動かすだけなら適当なフォルダで大丈夫です。
この出力先も後で必要になるので、手元にコピーしておいてください。
![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/cd58b0d7-0f0e-e26b-8d8e-023f90a7bda3.png)

「Create Table」→「from S3 bucket data」と進みます。
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/2a97ca57-1eb2-cb70-e59f-ed66ff6d2f69.png)

データベース名、テーブル名と、CSVを配置したフォルダのパスを入力します。**パスはフォルダまでで、ファイル名は不要です。**
![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/cfee906d-275a-fd7d-0225-b409b3193c06.png)

データフォーマットは「CSV」を選択します。
![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/2653797a-ceed-2e59-5521-d965323d91b0.png)

カラムを定義します。今回の例では以下の7つのカラムを定義しました。

* date (date型）
* open（int型）
* high（int型）
* low（int型）
* close（int型）
* volume（bigint型）
* stock_trading（bigint型）

![09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/883693b3-c4fd-22a3-3e34-99a38cd06602.png)

パーティションは特に追加せずにテーブルを作成します。
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/f901919a-1ffc-5b5d-9d46-7f6b67fe5256.png)

テーブル作成が成功したらResultsに「Query successful.」と表示されます。
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/5179a254-c7ab-664f-2c92-f3c4560925b0.png)

Athenaの画面上でクエリを実行してみると、CSVファイルを探索した結果が返ってきました。
![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/256dd8c5-1314-4479-1d0e-e58e65f7a68a.png)

## Yellowfinのデータソースを設定する

### JDBCドライバの入手

[AWSから提供されているAthenaのJDBCドライバ](https://docs.aws.amazon.com/ja_jp/athena/latest/ug/connect-with-jdbc.html)を入手します。ご自身の環境に合わせた適切なものをダウンロードしてください。

### プラグインの追加

Yellowfinのメニューの「管理」→「プラグイン管理」から、入手したJDBCドライバをプラグインとして追加します。

![15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/011ead89-d926-8380-be61-6aee456cdb1c.png)

### データソースの追加

プラグインを追加すると、データソース作成時にデータベースタイプ「Amazon Athena」が選択可能になります。
![17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/f5d05322-d943-d08b-8148-2f4eb276fd62.png)

以下の4箇所を入力します。

* リージョン：AWSのリージョン名
* S3の場所：上記手順で設定したクエリ実行結果の出力先のパス
* ユーザー名：上記手順で設定したアクセスキーID
* パスワード：上記手順で設定したシークレットアクセスキー

![18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/444aae62-8d74-a21b-2db1-998320d8d2d9.png)

接続に成功すれば、あとはごく普通にビューやレポートを作成することが可能です。
![19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/75c60c64-f6c9-8fda-657b-b35a851e6b45.png)