spark-shell 気象条件が与える観客動員数への影響を調べる(1)

#### 目的
Apache Spark の MLlib による機械学習を用いて、気象条件が与える甲子園球場におけるプロ野球観客動員数への影響を調べてみます。
※こちらの投稿はデータの準備段階までです

#### データの準備

##### 気象データ
2019年3月29日から9月30日までの気象データを気象庁のページより取得しました（ありがとうございます）。
ただ、西宮市のデータには気温や風速などの情報が無かったため、代わりに大阪市のデータを取得しています。
[過去の気象データ・ダウンロード](http://www.data.jma.go.jp/gmd/risk/obsdl/index.php)

色んなデータが指定出来るようですが、とりあえず今回指定した項目は以下です。
- 降水量の合計(mm)
- 平均気温(℃)
- 平均風速(m/s) 
![0113ave_temperature.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63951/df70b030-c11e-f391-12b0-86bdb925af4f.png)
これを weather.csv という名前で保存しておきます。

##### 観客動員数データ
2019年シーズンの成績データを以下のページを参考にさせていただきました（ありがとうございます）
[プロ野球Freak](https://baseball-freak.com/)

使用したいデータは甲子園の観客動員数のみでしたが、ついでに勝敗や対戦相手なども取得しました。
ここで開始時刻と勝敗については、以下のように変換しています。
[開始時刻]
14:00(デイゲーム) -> 0
18:00(ナイトゲーム) -> 1

[勝敗]
勝ち-> 0
負け -> 1
引き分け -> 2
![0113tigers.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63951/6830cf79-6d80-365a-63d0-007797aab4b9.png)

それぞれのファイル(weather.csv, game.csv) を HDFSに保存しておきます。
今回は /data/mllib/input/ 配下に保存しました。

また、予めフィールド名を以下のように変更しておきました。
###### weather.csv
![0114weather.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63951/fc2d050c-1ee3-7478-5e2a-0f8f579519cf.png)

###### game.csv
![0114game.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63951/451b3e84-0435-52d5-9cb1-cecc3c601a06.png)

#### spark-shell の起動
```bash
/usr/hdp/2.6.2.0-205/spark2/bin/spark-shell --master yarn --deploy-mode client --packages org.apache.lucene:lucene-kuromoji:3.6.2 --conf spark.serializer=org.apache.spark.serializer.KryoSerializer
```
バージョンは以下のとおりです。

```bash
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 2.1.1.2.6.2.0-205
      /_/
         
Using Scala version 2.11.8 (OpenJDK 64-Bit Server VM, Java 1.8.0_232)
```

##### 気象データを読み込む
Weather の case class を定義しておきます。

```bash
case class Weather(
  date: String,
  dayOfWeek: String,
  rainfall: Double,
  aveTemp: Double,
  aveWindSpeed: Double)
```

spark のライブラリを使用して、DataFrame として読み込みます。

```bash
scala> import org.apache.spark.sql.Encoders
scala> val schemaWeather = Encoders.product[Weather].schema
scala> val weatherCSV = spark.read.option("header","true").schema(schemaWeather).csv("/data/mllib/input/weather.csv").as[Weather]
scala> weatherCSV.first
res0: Weather = Weather(2019/3/29,金,0.0,12.1,2.0)
```

##### 観客動員数データを読み込む
BaseballGame の case class を定義しておきます。

```bash
case class BaseballGame(
  date: String,
  startTime: Integer,
  result: Integer,
  opponent: String,
  startingPitcher: String,
  audience: Integer,
  gameTime: Double)
```

spark のライブラリを使用して、DataFrame として読み込みます。

```bash
scala> val schemaGame = Encoders.product[BaseballGame].schema
scala> val gameCSV = spark.read.option("header","true").schema(schemaGame).csv("/data/mllib/input/game.csv").as[BaseballGame]
scala> gameCSV.first
res6: BaseballGame = BaseballGame(2019/4/9,1,0,DeNA,ガルシア,46298,3.5)
```

##### スキーマの確認
気象データ、観客動員数データそれぞれのスキーマを確認しておきます。

```
scala> weatherCSV.printSchema
root
 |-- date: string (nullable = true)
 |-- dayOfWeek: string (nullable = true)
 |-- rainfall: double (nullable = true)
 |-- aveTemp: double (nullable = true)
 |-- aveWindSpeed: double (nullable = true)

scala> gameCSV.printSchema
root
 |-- date: string (nullable = true)
 |-- startTime: integer (nullable = true)
 |-- result: integer (nullable = true)
 |-- opponent: string (nullable = true)
 |-- startingPitcher: string (nullable = true)
 |-- audience: integer (nullable = true)
 |-- gameTime: double (nullable = true)
```

##### データの結合
date カラムを使って、気象データと観客動員数データを結合します。
観客動員数データの方が少ないため、これに対して気象データを結合していきます。

```
scala> val gameAndWeather = gameCSV.join(weatherCSV, "date")
scala> gameAndWeather.show
+---------+---------+------+--------+---------------+--------+--------+---------+-----------+-------+------------+
|     date|startTime|result|opponent|startingPitcher|audience|gameTime|dayOfWeek|rainfall|aveTemp|aveWindSpeed|
+---------+---------+------+--------+---------------+--------+--------+---------+-----------+-------+------------+
| 2019/4/9|        1|     0|    DeNA|           ガルシア|   46298|     3.5|        火|        0.0|   12.3|         3.2|
|2019/4/10|        1|     1|    DeNA|             青柳|   40116|    3.23|        水|       16.0|    9.3|         3.5|
|2019/4/11|        1|     1|    DeNA|             秋山|   38078|    3.27|        木|        0.0|   11.4|         3.3|
```

データを結合するところまでできました。
こちらのデータを用いて、引き続き分析を進めていきます。