Morning Girl

Web API, Windows, C#, .NET, Dynamics 365/CRM etc..

Embulk を使って kintone から MySQL にデータをロード:CData JDBC kintone Driver

前回の記事では、シンプルなCSVファイルからMySQLへ、Embulkを使ってETL処理を実施しました。

今回は趣向を変えて、クラウドサービス kintone から MySQLにデータをロードしてみたいと思います。

対象データ

対象データは kintoneのテンプレートアプリである顧客リストを対象にしました。

f:id:sugimomoto:20190828235013p:plain

こんな感じの項目がそろっています。そして、日本語カラム名というのがポイントですね。

f:id:sugimomoto:20190828235021p:plain

DWHやBIを実施する上でも顧客マスタは必須のデータです。最近は何かとデータがクラウドに分散されているので、こういったアプローチを取りたい方は多いのではないかなと。

どうやって Kintone からデータを吸い上げる?

f:id:sugimomoto:20190828235041p:plain

通常 kintone はAPIアクセスもしくはCSV連携でDWHなどにデータをロードするのが一般的かと思います。

CSVは言わずもがなですが、手動でCSVをダウンロードする必要があるため、常に最新のデータを分析したいユーザーにはひと手間多いです。

また、Embulk でもすでに公開されている Salesforce Plugin のように頑張って Plugin を書けば実現できますが、API をどのようにテーブルに咀嚼するか、ページングやフィルター処理はどうするか等、勘案することはかなり多いのですし、あまり手軽ではありません。(その点、SalesforceだとSOQLのようなクエリ言語があるので、案外親しみやすいかもしれません)

なので、今回は CData Software で公開している CData JDBC Kintone Driver を使って、この部分を解消します。

上記の図で示すように、Embulk ではJDBC Input Pluginが公開されているので、これをCData JDBC Kintone Driver と組み合わせて、データのロードを実現します。

CData Kintone JDBC のインストール

それでは実際にやってみましょう。

まず、以下のURLから CData Kintone JDBC Driver をダウンロードします。30日間のトライアルがあるので、それを使っても大丈夫です。

https://www.cdata.com/jp/drivers/kintone/jdbc/

ダウンロードしたZIPファイルを解答し、setup.jarを実行して、インストールします。

f:id:sugimomoto:20190828235051p:plain

インストール後、「C:\Program Files\CData\CData JDBC Driver for kintone 2019J\lib」にドライバーのjarファイルが生成されます。ここのファイルパスを後ほど使います。

f:id:sugimomoto:20190828235057p:plain

JDBC Input Plugin のインストール

次に、EmbulkとCData JDBC Driverをつなぎこむための、JDBC Input Plugin をインストールします。

https://github.com/embulk/embulk-input-jdbc/tree/master/embulk-input-jdbc

embulk gem install embulk-input-jdbc

MySQL Output Plugin のインストール

前回のBlogでもインストールしていますが、念の為。

https://github.com/embulk/embulk-output-jdbc/tree/master/embulk-output-mysql

以下のコマンドでMySQLの Output Pluginがインストールできます。

embulk gem install embulk-output-mysql

configファイルの構成

最後にEmbulkのconfigファイルで、JDBC Inputの設定を記述します。

接続のための詳しい内容はこちらのオンラインヘルプでも確認できます。

kintone-mysql.yml というファイル名で作成しました。

in:
  type: jdbc
  driver_path: C:\Program Files\CData\CData JDBC Driver for kintone 2019J\lib\cdata.jdbc.kintone.jar
  driver_class: cdata.jdbc.kintone.KintoneDriver
  url: jdbc:kintone:URL=https://XXX.cybozu.com/;User=XXXXX;Password=XXXX;
  table: "顧客リスト"
out: 
    type: mysql
    host: localhost
    database: DatabaseName
    user: UserId
    password: UserPassword
    table: "顧客リスト"
    mode: insert

ポイントはJDBC URLですね。以下のように接続したいKintoneテナントのUserID・パスワード・URLを入力します。

kintoneの接続情報 設定項目
ユーザID User
パスワード Password
kintoneのサブドメイン含むサイトURL  Url

あとは、専用のクラス名と kintone JDBC Driverのファイルパスを指定すればOKです。

テーブル名では、取得したいアプリの名前を記述します。日本語のリスト名でも大丈夫です。

実行

これで準備完了です。あとは「embulk run」で実行するだけです。

embulk run kintone-mysql.yml

実行すると、途中 kintone のレコードをInsertしているのが見えますね。

f:id:sugimomoto:20190828235113p:plain

実行後、MySQL Workbenchからテーブルを確認してみると、以下のようにデータが取得できました。

日本語のテーブル名・カラム名でテーブルが作成され、データが登録されていることが確認できますね。

f:id:sugimomoto:20190828235119p:plain

補足

ちなみに、上記の例ではテーブル名を直接指定しましたが、以下のようにSQL Queryを書いてもいいです。

Where句で作成日や修正日を指定すれば、最新のデータだけを対象にすることも可能です。

in:
  type: jdbc
  driver_path: C:\Program Files\CData\CData JDBC Driver for kintone 2019J\lib\cdata.jdbc.kintone.jar
  driver_class: cdata.jdbc.kintone.KintoneDriver
  url: jdbc:kintone:URL=https://XXX.cybozu.com/;User=XXXXX;Password=XXXX;
  query: "SELECT [RecordId],[会社名],[部署名] FROM [顧客リスト] WHERE [RecordId] = 1"
out: 
    type: mysql
    host: localhost
    database: DatabaseName
    user: UserId
    password: UserPassword
    table: "顧客リスト"
    mode: insert

このあたりのサポートしているSQLこちらのリファレンスをどうぞ。

MySQLへの登録はInsert以外にも、MergeやReplaceもあるので、上記のSQLと組み合わせて柔軟に移行できると思います。

https://github.com/embulk/embulk-output-jdbc/tree/master/embulk-output-mysql#modes

また、CData JDBC Driver は kintone以外にもなんだかいっぱいあります。私は次にTwitterを試してみようかと画策中です。

CData JDBC Driver List

f:id:sugimomoto:20190828235130p:plain