Pentaho Data Integrationで天気データをAPIより取得する

日々の天気データをAPIで取得する処理を作成する機会があったので、データ取得部分について共有しておきます。
今回は、無償で使用できるAPIから、その時点の天気データを取得するという流れになります。


# 使用する天気データ
無償で使用できる天気データはいろいろとありますが、今回は[OpenWeatherMap](https://openweathermap.org/)を使用しています。
まず、アカウントを作成して、APIキーを生成します。
この辺は、いろいろなところに説明があるので割愛しますが、普通にアカウントを登録して、管理メニューから「My API Keys」を選択すると、キーの確認や新しいキーの作成などができるので特に迷うことは無いかと思います。


# API Keyの確認
OpenWeatherMapへログインし、API Keyを確認します。
以下のように見えるはずです。
<img width="800" alt="wathermap_101.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186651/92f9ceb5-8bb8-ab18-a244-0ae1ed6ca56f.png">
このKeyを以下の設定で使用します。



# 天気データの取得方法を確認
今回は都市名を指定して、アクセスした時点の天気データを取得することにしたいと思います。
アクセス方法は以下をご確認ください。
https://openweathermap.org/current

具体的には、"Call current weather data for one location"の"By city name"に記載のある、

```
api.openweathermap.org/data/2.5/weather?q={city name}&appid={API key}
```
を使用します。
このURLに取得したい都市名とアクセスするためのKeyを設定してアクセスするとデータが取得できます。
試しに、ブラウザでアクセスすると以下のような画面が表示されます。
<img width="600" alt="wathermap_102.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186651/0056f696-3028-f962-d1a4-9ac58eb64cd9.png">
q=tokyoで取得する先を指定し、appid=で自分のKeyを指定してアクセスすると、アクセスした時点の天気データをJson形式で取得することができます。


# PDIでAPIを実行する
- APIの実行

RESTクライアントを配置して、URLを設定しOKボタンで設定を保存します。
![wathermap_103.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186651/1c460074-fb81-5df9-29a4-bc6871be72a3.png)

このまま実行しても、RESTクライアントステップは単独では動かない(データ取得系のステップと接続されていないと動かない)ので、データグリッドステップとつないで、プレビューを行います。
![wathermap_207.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186651/1548df99-ad1b-1e3c-2382-6ce3cc6e36f2.png)

- APIから取得した結果のJson形式のデータをパースする

上記まででresultフィールドにJson形式のデータを取得することができました。
ただ、Json形式のままだとデータが使用しづらいので、必要なデータのみを取得したいと思います。

まずJsonデータを取得、パースするためのステップである、JSON inputステップを配置します。
次に、APIの結果が格納されているresultフィールドからデータを取得するようにJSON inputステップの設定を行います。
![wathermap_108.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186651/55cc7248-3a86-65a3-044a-19bee9e4efc5.png)
これで天気データの取得まではできるようになりましたので、続いてJsonデータをJsonPathでパースする設定を行います。
今回は、天気(晴れとかくもり)と最低気温、最高気温、湿度を取得します。
<img width="500" alt="wathermap_109.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186651/28242349-e92c-15c0-0bf7-c7fc74f1000c.png">

プレビューした結果は以下のとおりです。
<img width="500" alt="wathermap_110.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186651/9a8a2047-0e69-9eec-d240-69c8bd72b1ac.png">
※上記の設定では、気温がケルビン単位で返ってきますので、気温を摂氏(℃)で取得したい場合はURLに「units=metric」の条件を追加してください

JsonPathの設定方法は、以下をご確認ください。
https://goessner.net/articles/JsonPath/

なお、返却されるデータによっては、指定したPathではエラーになることがあるので、詳しくはいろいろと設定を変更しながら試していただければと思います。
きちんと調べてないので詳細はわかりませんが、weatherが2種類返却されることがあるようなので、必ず1件目を取得するようにしておくなど、検討する必要があるかと思います。
ちなみに、weatherの1件目を取得するで良い場合は、「$.weather[0].main」と指定しておけば必ず1件目のみが取れるようになります。

- JsonPathを自動的に設定する

APIから取得した結果をファイルに保存し、そのファイルを読み込むことによって、自動的にJsonPathを設定することも可能です。
その場合はまず、保存した結果ファイルを読み込むようにJSON inputステップを設定します。
<img width="700" alt="wathermap_111.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186651/7ca4249a-17ab-4b97-e71e-342912e59f4d.png">
次に、フィールドタブへ移動して、Select filedsボタンを押下して設定を続けます。
![wathermap_114.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186651/22b2b7cb-b76c-95c3-df38-20fab58cb5db.png)
OKを押下すると、以下のように自動的に設定されます。
<img width="700" alt="wathermap_115.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186651/749feaf6-3e59-22d5-8bf6-de8cf7af2498.png">




# 複数の都市のデータを一括で取得する
ここまでで、URLに単独都市名を指定して、データを取得することは確認できました。
次に、取得したい複数の都市名をリスト化しておいて、それを読み込ませることで一括でデータを取得できるようにしていきます。

実行用に追加していたデータグリッドを以下のように修正します。
![wathermap_119.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186651/57dc0eb0-8fc4-ecbc-25b8-43c54283153d.png)

続いて、数式ステップを配置し、データグリッドステップとRESTクライアントステップの間につなげます。
![wathermap_120.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186651/6b30bd11-2d97-b38b-e1bc-2e89ea1fc741.png)
数式設定は、数式の箇所をクリックすると、以下のような数式設定用のWindowが立ち上がるので、こちらで設定します。
![wathermap_121.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186651/237381a0-b85f-24b7-84eb-ba8d09d52e86.png)
少々見づらいので抜き出しておきます。"URL"と[city]を&でつなげてAPIへアクセスするためのURLを作成しています。
フィールドに入っている値は[]で呼び出せるので、ここでは[city]としてURLに都市名を埋め込んでいます。

```
"https://api.openweathermap.org/data/2.5/weather?q=" & [city] & "&appid=xxxxxxxxxxxxxxxxxxxxxxxxxxx"
```

最後に、RESTクライアントステップの設定を変更します。
![wathermap_122.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186651/3e0bf353-3141-46a1-d4fc-1e07253e52b9.png)
ここまで設定したら、JSON inputステップ上でプレビューを行い結果を確認します。
<img width="600" alt="wathermap_123.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186651/3a50acd4-f0e1-8bec-ae76-a37bfbf09f37.png">


以上で、REST-APIより天気データを取得することができました。
ここから先は、DBへロードしたり、CSVで出力したり、好きなように処理をつなげて行けばよいかと思います。