MemSQLを使ってみようVol.12: 実践編5

#今回はR環境とコラボレーションします！
以前、Rの環境整備に関する記事を書かせて頂きましたが、その後のアップデートが無い！と指摘される前に、今回はオープン系の深度解析環境として有名なこのソリューションとMemSQLのコラボレーションについて少し詳しく解説したいと思います。

![スクリーンショット 2020-02-19 18.48.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197589/7fdc2c1c-6605-84bc-b303-27e78dc32002.png)


R自体は、既に多くの方が紹介・実践応用等の記事を投稿されていますので、ここではその詳細に関して触れる事はしませんが、これまで紹介してきましたMemSQLとの連携により、何が可能になるのか？等を中心に、周辺環境の強化という視点で幾つかの参考になれば幸いです。

####Zoomdataにxx回帰分析系の処理機能があるのか？という指摘・・・
実は、以前の回で紹介させて頂いたZoomdataを、いわゆる保守本流のBIイメージで見た場合に、現状の仕様上持ち合わせていない機能として、各種の学術的な深度解析系を直接的にサポートしていません。これは、Zoomdata自体がリアルタイム・ストリーミングのデータ環境を即時可視化させ、機械学習の過程やオンラインマーケティング等の状況を処理出来る方向に実装を振っている事に起因しています。

####固定的に提供される専用の解析環境 vs 適材適所で柔軟且つ選択可能な解析環境
BIというカテゴリに属するとした場合に、こレラの深度解析機能を標準で持っていないのに、それらを標準で提供する製品と競合するとは言えないのでは？という疑問は確かに頂く事が有ります。確かにBIにはこれらの深度解析機能が必須！という絶対条件が有るのであれば、ZoomdataはBIではなくリアルタイム・ストリーミングCI（チャート・インテリジェンス）と自己紹介をしなければならないかもしれません。ただ逆の発想で言えば、今後益々の発展・成長が見込まれる機械学習（ML）からのAI環境構築や、既に一般化指摘ている各種のIoT系ソリューションにおけるデータマイニングといった領域において、これらの解析エンジンに対する自由度と柔軟性を提供できる（ユーザや利用形態に合わせて解析エンジンを最適化できる）という部分で、新たなアドバンテージと将来的な可能性を提供できるという事も事実だと思います。

####MemSQLやZoomdataとの組み合わせで新たな付加価値を！
MemSQLをデータマイニング用の標準SQLが使える、最新の分散インメモリデータベースとして位置付け、その情報に対してライブでリアルタイム・ストリーミング可視化を実現できるZoomdata,また高度な深度解析、ML評価、そしてAIのエンジンとしても採用されているRやSAS等の深度解析エンジンを最適に組み合わせる事で、高い相乗効果と投資対効果を実現できる仕組みを構築できるようになります。

##MacへR環境を導入します・・・
今回は、Macの環境に必要な仕組みを構築して行く事にします。まずはRとRStudioをMac上に導入して行きます。

RのMac版をダウンロードするために、[Rのホームページからダウンロードのページに](https://cloud.r-project.org)入ります。

![スクリーンショット 2020-02-15 15.13.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197589/976769d2-e9c3-c5e2-555d-fc17b8b17e3c.png)

Mac版をダウンロードしてインストールを行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197589/7ef277f5-fc6c-bef1-a6b5-e4a4951c27ee.png)

Mac版は、通常のパッケージ形式になっていますので、そのままインストール作業を進めて行けば問題無いと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197589/c1a2fd7a-4736-86f3-3663-49aa5bd6bdd5.png)

今回の検証では、バージョン３.６。２を使いました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197589/f3bdeff9-4fb7-ebe3-dda2-36b1e770578d.png)

基本的には、「続ける」を選択しながら、適宜必要な情報を設定すればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197589/78988ac6-ec58-02ce-b4c9-baee39b23669.png)

実にあっけなく導入が終わりました。念のためにRのコンソールを起動してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197589/ab89beaa-23b5-108c-60c7-8c0b7b468e3f.png)

無事にRが入ったので、次の作業を行います。


##周辺環境の導入
次にコマンドラインの環境を強化しておきますので、[Homebrewのインストール](https://brew.sh/index_ja.html)行います。
前述のR環境の導入で、RStudio に関しては、このHomebrew導入確認を兼ねて

~~~shell
% brew cask install rstudio
~~~

という感じで実行しても良いかもしれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197589/e388e9ef-0b9f-5564-c042-c224b3337648.png)

##R環境にDB関連の環境を構築
次にR環境に今回連携に使用するDB関連の環境を構築します。まずはRStudioのコンソールに入って以下の環境を導入してください。

~~~shell
> install.packages("DBI")
> install.packages("RMySQL")
~~~
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197589/8f39bf7a-e5e0-c60d-eb16-001218bfc6b1.png)

今回の作戦としては、MemSQLのMySQL互換性を活用し、Rが持っているMySQL連携の機能を使わせてもらう事にします。また、他のDB（PostgreSQLなど）を使う場合は、２番目のコマンド内のRMySQLを随時変更すればOKです。

#取り急ぎMemSQLと接続してみる
ここまでの作業が無事に終われば、後はMemSQLに１８番のMySQLのフリをしてもらい、何食わぬ顔で坦々粛々とクエリ通信を行ってもらうだけになります。
今回は、Mac上にDocker 環境を作って、その上でDocker版のMemSQLを動かす事にします。[Docker環境へのMemSQL導入は以前の回で紹介させて頂きましたので](https://qiita.com/wadaken1961/items/c522ba39c1e1c51c2219)、今回初めて作業を行う！という方は、ぜひ参考にしてみてください。

Docker上でMemSQLを起動します。

~~~shell
% docker start memsql-ciab
~~~

今回は、取り急ぎの接続確認ですので、MemSQLのメタデータを参照してみる事にします。（あくまでも！参照だけにしておいてください。中身を弄ると動作に不具合を起こす事が有りますので・・・）

####DatabasesのタブからInformation_schemaを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197589/4a82eaf5-dd51-c092-fb23-c88e9d4a1fc7.png)

###一番上のTABLE_STATISTICSを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197589/c8f0e3be-f29a-77b9-c84e-2cbf12a7f43a.png)

###Sample Dataタブを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197589/e9c6d72a-719a-8eb2-dda2-9145ff428475.png)

今回は、このテーブル情報をR経由で参照して表示してみる事にします。

##R環境での作業・・・
まずは、接続に必要なスクリプトをR上で設定してください。

追記：Windows環境の場合、以下の処理を行う前に

~~~shell
> require("DBI")
> require("RMySQL")
~~~

を行ってください。

~~~shell
> connection01 <- dbConnect(MySQL(), host="127.0.0.1", port=3306, dbname="information_Schema", user="root", password="")
> dataset <- dbGetQuery(connection01,"SELECT * FROM TABLE_STATISTICS")
~~~

ここでのポイントは、host=の部分になります。一見localhostでも良い様に見えるのですが、ここは敢えてIPアドレスで書くようにしてください。

~~~shell
 .local(drv, ...) でエラー: 
  Failed to connect to database: Error: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
~~~

というエラーに追いかけられる事になるかと・・・・（汗）

無事に通過できたら以下のコマンドをR上で実行します。

~~~shell
> print (dataset)
~~~


~~~sql
  DATABASE_NAME TABLE_NAME ORDINAL      HOST PORT NODE_TYPE PARTITION_TYPE ROWS MEMORY_USE      STORAGE_TYPE ROWS_IN_MEMORY
1        testDB  testTABLE       0 127.0.0.1 3307      Leaf         Master    0          0 INMEMORY_ROWSTORE              0
2        testDB  testTABLE       1 127.0.0.1 3307      Leaf         Master    0          0 INMEMORY_ROWSTORE              0
3        testDB  testTABLE       2 127.0.0.1 3307      Leaf         Master    0          0 INMEMORY_ROWSTORE              0
4        testDB  testTABLE       3 127.0.0.1 3307      Leaf         Master    0          0 INMEMORY_ROWSTORE              0
5        testDB  testTABLE       4 127.0.0.1 3307      Leaf         Master    0          0 INMEMORY_ROWSTORE              0
6        testDB  testTABLE       5 127.0.0.1 3307      Leaf         Master    0          0 INMEMORY_ROWSTORE              0
7        testDB  testTABLE       6 127.0.0.1 3307      Leaf         Master    0          0 INMEMORY_ROWSTORE              0
8        testDB  testTABLE       7 127.0.0.1 3307      Leaf         Master    0          0 INMEMORY_ROWSTORE              0
> 
~~~

無事にRとMemSQLのクエリ連携が、得意のMySQLのフリ作戦で実行できました！！

処理が終わったので、セッションの後始末をしておきます。

~~~shell
> dbDisconnect(connection01)
~~~

#次にMemSQLへデータを書き込んでみる
MemSQLからのデータ取り込みに目処が付きましたので、今度はRからMemSQLにデータを書き込んでみます。
基本的には読み出しと同じ手順でクエリベースの処理になりますので、まずは書き込む先の受け皿を準備します。

###(1)データベースの定義とテーブルの作成
MemSQL上でデータベース、テーブルの定義を行います。R側からも設定が可能ですが、今回の検証では慣れ親しんだ方で実施しました。

~~~SQL
CREATE DATABASE IF NOT EXISTS r_db;
USE r_db;

DROP TABLE IF EXISTS r_table01;
CREATE TABLE r_table01(
   r_id01   INT auto_increment primary key,
   r_sin    DECIMAL(10,9) NOT NULL
);

DROP TABLE IF EXISTS r_table02;
CREATE TABLE r_table02(
   r_id02   INT auto_increment primary key,
   r_kakudo INT NOT NULL
);

DROP TABLE IF EXISTS r_table03;
CREATE TABLE r_table03(
   r_id0    INT auto_increment primary key,
   r_kakudo INT NOT NULL,
   r_sin    DECIMAL(10,9) NOT NULL
);
~~~

###(2)RとMemSQLを接続する

~~~shell
> connection02 <- dbConnect(MySQL(), host="127.0.0.1", port=3306, dbname="r_db", user="root", password="")
~~~

###(3)所定のデーブルにデータを挿入する
今回は、シンプルにRの三角関数を使った簡単な数値計算を行い、その結果と関連情報をMemSQLに書き込んでみます。

####まずは、Rで三角関数を計算・・・
今回の検証では、シンプルに０度から１８０度までの角度に対して、Rの標準三角関数**sin**を使った計算を行います。角度の取り扱いは、基本的にラジアン単位になるので、**度**から**ラジアン**への変換処理を行って計算させます。
Rの場合は、データフレームという概念が非常に便利なので、今回は一旦全ての情報をデータフレームとして取り扱い、３種類のMemSQL上に作成するインメモリテーブルへ流し込んでみます。（実際には３番目のデータフレームだけをMemSQLに流し込めばOKです）

~~~shell
> rad = pi/180
> y <- data.frame(0:180)
> x <- data.frame(sin(y*rad))
> z <- data.frame(cbind(y,x))
~~~

実際にRで処理してみると・・・
![スクリーンショット 2020-02-16 23.01.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197589/c718ad70-5ff1-4428-c567-35a8b45a8a62.png)

![スクリーンショット 2020-02-16 23.01.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197589/69120501-0c2c-76fd-63bd-99828ccc4b53.png)

![スクリーンショット 2020-02-16 23.51.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197589/ed50f0c3-147d-6d5e-b67d-cd8c3ef0557f.png)

Rで計算した結果をデータフレーム化して、をれらをMemSQLで用意してあるテーブルに送り込む処理は、dbWriteTableを使って行います。今回の検証では、下記の記述で実施しました。

~~~sql
> dbWriteTable(connection02,"r_table01",x,overwrite=TRUE)
> dbWriteTable(connection02,"r_table02",y,overwrite=TRUE)
> dbWriteTable(connection02,"r_table03",z,overwrite=TRUE)
~~~

データの格納状況をMemSQLで確認してみます。
まずは、三角関数（SIN）の計算結果・・・

~~~sql
SELECT * FROM r_table01;
~~~

![スクリーンショット 2020-02-16 23.15.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197589/2f251524-7555-ccfe-e4f4-eab45358054a.png)
無事にデータフレームの情報をMemSQLに定義したカラムへ送り込めました。（０度から１８０度までなので、総数が１８１個）

次に対応する角度の情報・・・

~~~sql
SELECT * FROM r_table02;
~~~

![スクリーンショット 2020-02-16 23.14.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197589/3cf07b66-fb5b-7747-143e-304fe992c90f.png)
こちらも同様にカラムへ格納されました。

最後に２つのデータフレームをバインド（今回は横に並べる方式で合成しました）した結果を・・・

~~~sql
SELECT + FROM r_table03;
~~~

![スクリーンショット 2020-02-16 23.46.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197589/d761d5c4-6d46-9c58-aa13-7d07a43f37ac.png)

これも無事にバインド後の情報が全てテーブルに送り込めています。


###因みにMemSQLからデータを読み出す方法（追加）・・・
本稿の前半でSQLクエリを使ったデータの取得を検証しましたが、実際の現場ではデータフレーム単位で読み込んだ方が便利な場合が有ります。Rの場合ではdbWriteTableの相方として、dbReadTableという関数が用意されているので、これを使えば簡単にデータフレーム単位で処理を行う事が出来ます。

実際に、今回の環境で先ほど書き込んだデータフレームを読み出してみます。

~~~sql
> df1 <- dbReadTable(connection02,"r_table01")
> df2 <- dbReadTable(connection02,"r_table03")
~~~

![スクリーンショット 2020-02-17 0.41.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197589/4b190822-76d0-20c3-3317-f86f7637eb3b.png)
![スクリーンショット 2020-02-17 0.43.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197589/d87f98e7-05d3-a65f-3af7-742e34e3621f.png)
先ほどMemSQLに格納されたテーブルをデータフレームとして読み出す事が出来ました。

処理が終わったので、セッションの後始末をしておきます。

~~~shell
> dbDisconnect(connection02)
~~~

#今回のまとめ
今回は、広く高度解析エンジンとして活用されているRと、これまで色々な検証を行ってきたMemSQLを連携させてみました。検証作業そのものは、実際にRからMemSQL上のテーブル情報が参照で出来るか？、またRで計算したデータをMemSQL上のテーブルに格納出来るか？といった、非常に基本的な段階の流れを確認しただけですが、MemSQLを中心に、データマイニングの仕組みを考えた場合の、深度解析やML/AI連携などのケースで、色々と活用出来そうな感じは掴んで頂けたかと思います。

今回の検証実験を活用する事で、機械学習をMemSQL上で処理しながら、その情報をR側に参照させて高度な分析を行って、処理仮定から導出された結果をMemSQL上に格納すると同時に、関連する情報を纏めて一つのダッシュボード上にZoomdataを用いて可視化する事が可能となり、またその先に有るAI環境へのデータ処理作業を一気に加速・効率化が可能になります。

学習過程を可視化し、設定や仮定との齟齬・解離を即時判断出来ると同時に（MemSQL＋Zoomdataのストリーミング処理）、インメモリ上のデータマイニングテーブルをMemSQLで高速でインタラクティブな処理を行いながら、また他の関連するデータ参照を一つの仕組みの中で並列に処理する事で、サイロの壁を超えたデータマイニング環境を手に入れ、新たな洞察や精度と質の高い**データを諦めないデータドリブン**を実現する事が出来るようになります。

#余談・・・
Docker版のMemSQLとR環境をMac（コア数の問題が有るので、機種は限定されますが・・）上で一緒に動かすと、非常に便利なアカデミック的解析環境が出来ますね。MemSQLのインメモリパワーで、高速なSQLトランザクションを使い、手回し良くETL系作業を行い（試しにやってみる！が出来るかと・・）Rに流し込んで深度解析を行い、万が一想定が外れてもMemSQLパワーでインタラクティブに再試行が可能です。

全国のRユーザ様！　
ぜひお試しください！！

[**MemSQLを使ってみようVol.13: 実践編6**](https://qiita.com/wadaken1961/items/ca7496de4eeeaf617b7a)に続く

#謝辞
本解説に転載させて頂いているスクリーンショットは、一部を除いて現在MemSQL社が公開されている公式ホームページの画像を使わせて頂いており、本内容とMemSQL社の公式ホームページで公開されている内容が異なる場合は、MemSQL社の情報が優先する事をご了解ください。