CData Software Blog

クラウド連携のCData Software の技術ブログです。

データ仮想化ドライバー CData Query Federation Driver で複数データソースに単一SQLでアクセス

はじめに

CData Japan技術ディレクターの桑島です。本記事では、現在(2020/05)β版としてリリースした新製品 CData Query Federation Driver についてご紹介します。

CData Query Federation Driver とは

複数のデータソースに単一のSQLでクエリ出来るDriver製品です。現在(2020/05/03)、JDBC / ADO.NETの2つのテクノロジーラインにてベータ版で提供しています。

f:id:kuwazzy:20200503074841p:plain

誕生した背景

CDataが提供するCData Drivers製品は、データソース毎に提供しています。これにより1つのDriver製品は基本1つのデータソースにのみアクセス出来ます。逆に言うと、データソースを跨がるデータアクセス(複数のアプリに跨がるSQLのJOIN)はドライバ側では出来ませんでした。これまで弊社のテクニカルサポートにも多くのリクエストを多く頂いており、これまでは、Driver製品を組み込むアプリやプログラム側で実装する必要がありましたがCData Query Federation Driver の登場により、Driver側にて単一のSQLで複数のアプリに跨がるJOINができるようになりました。

利点

「複数のアプリに跨がるクエリ」というのが機能的な最大の特徴となります。これにより、ユーザーは様々なデータをオンデマンドで直接結合(JOIN)するクエリを作成し、リアルタイムのデータにアクセスが可能となります。また、データを物理的には移動しない「データ仮想化」テクノロジーであるため、データパイプライン(ETL/EAI)処理やDWHを構築を必要としないことも大きな利点でしょう。

ユースケース

それでは、CData Query Federation Driver を利用することで実現出来るユースケースを見てみましょう。

予実管理

営業案件はCRM / SFAで管理していて、予算や目標をExcelやGoogleSheetsなどのスプレッドシートで管理しているケースです。このようなユースケースでは、スプレッドシートCRM/SFAの案件実績データをコピーして利用する方法があります。その場合、最新の予実データを参照する都度、スプレッドシートに実績データの取り込みが必要となります。それによってバージョン管理やシートが重くなる壊れるといったいわゆるスプレッドシートリスクが生じます。そこで、スプレッドシートには予算データのみを格納しておき、アドホックSQLを発行してCRM/SFA内の案件実績データとスプレッドシートの予算データを取得して参照することが出来ます。実績データをスプレッドシートに取り込まなくて良いのは、データ仮想化テクノロジーの為せる技です。

例:kintoneの案件の実績データとGoogleSheetsの予算データを比較

f:id:kuwazzy:20200504120104p:plain

企業内検索(エンタープライズサーチ)

部門毎、企業内のグループ会社毎に顧客管理システムが異なる場合のケースです。部門によってはオンプレシステムのRDBに、SaaSCRM/SFAアプリケーションを利用しているケースもあるでしょう。これらの顧客データをアドホックSQLで横断的に検索することが出来ます。

例:Salesforce・kintoneなど複数のSaaSSQLServerなどのRDB、それぞれに分散している顧客データを横断的に検索 f:id:kuwazzy:20200504120136p:plain

分析切り口(ディメンション)の拡張

既存アプリケーションに持っていない分析の切り口(ディメンション)で集計したい場合で、それらの切り口となるマスタデータが別なシステムで保有している場合があります。例えば、CRM/SFAアプリケーションには、案件の担当者の情報しか保持しておらず、部門への所属データは従業員マスタと別なシステムに保持しているケースです。その場合も、アドホックSQLでマスタデータと結合(JOIN)することで別なシステムの分析切り口(ディメンション)での分析が可能となります。

例:SQLServerに格納されている従業員マスタ・組織マスタを使用してSalesforceの案件(Opportunity)毎の担当者(Owner)から部門毎の案件金額を集計 f:id:kuwazzy:20200504120205p:plain

利用方法

本製品は、JDBC Driver および、ADO.NET Providerで提供しておりますが、本例では、JDBC Driverを例に説明します。

Driver製品のインストール

CData Query Federation Driver を利用するには、まず、データソース毎の CData Drivers製品が必要です。上記の予実管理のユースケースの例だと、CData GoogleSheets JDBC Driver とCData kintone JDBC Driver です。下記のページからダウンロードしてインストールしてください。

www.cdata.com

www.cdata.com

また、Query Federation Driver for JDBC も下記のページからダウンロードしてインストールします。

www.cdata.com

DatabaseConfiguration.json ファイルの作成

DatabaseConfiguration.json ファイルとは、CData Query Federation Driverから各データソース毎のJDBC Driverを呼び出すための設定ファイルです。

  "KintoneSchema":{
      "driverClass":"cdata.jdbc.kintone.KintoneDriver",
      "connectionURI": "jdbc:kintone:User=xxxxx;Password=xxxxx;URL=https://xxxxx.cybozu.com/",
      "driverPath":"/Applications/CData/CData JDBC Driver for kintone 2019J/lib/cdata.jdbc.kintone.jar"
  },
  "GSheetsSchema":{
    "driverClass":"cdata.jdbc.googlesheets.GoogleSheetsDriver",
    "connectionURI": "jdbc:googlesheets:InitiateOAuth=GETANDREFRESH;SpreadSheet=1H2Q5f0oa-bUjBM-dIkfsLZ3yNNaS3lOvOLpEY_XXXXX;",
    "driverPath":"/Applications/CData/CData JDBC Driver for Google Spreadsheets 2019J/lib/cdata.jdbc.googlesheets.jar"
}

本設定ファイルを任意のディレクトリに保存します。本例では、Query Federation Driver for JDBC製品をインストールした下記のディレクトリに保存しました。

/Applications/CData/CData JDBC Driver for Query Federation 2019/DatabaseConfiguration.json

データソース毎の driverClassおよび、connectionURLはデータソース毎のJDBC Driver製品のマニュアルを参照ください。

cdn.cdata.com

cdn.cdata.com

driverPathは、データソース毎のJDBC Driverのライブラリ(.jar)のファイル名を含むディレクトリパスを指定します。上記JSONでの例はMacOSでのインストールパスの例です。

アプリケーション側の設定

本例では、JDBC Driverを利用してSQLを実行出来るツールとしてDBVisualizer を例に説明します。

DriverManagerを開き、Query Federation Driver for JDBCのインストールパス(MacOSでのデフォルトインストールパスは、/Applications/CData/CData JDBC Driver for Query Federation 2019/lib/cdata.jdbc.queryfederation.jar)を指定して、ドライバがロードされることを確認します。

f:id:kuwazzy:20200504140430p:plain

Create Database Connection にて上記DriverManagerで作成したドライバ情報(本例では、CDataQueryFederation)を選択して、Database URLに以下の文字列をセットします。

jdbc:queryfederation:DatabaseConfiguration=/Applications/CData/CData JDBC Driver for Query Federation 2019/DatabaseConfiguration.json;

driverClassおよび、connectionURLはQuery Federation Driver for JDBCの製品マニュアルを参照ください。

cdn.cdata.com

DatabaseConfigurationのパスは上記「DatabaseConfiguration.json ファイルの作成」の手順で作成したファイルのパスを指定してください。Connectボタンをクリックして左側のDatabaseタブを開いていくと、GoogleSheetsとkintoneそれぞれのスキーマ内にアクセス出来るテーブルが表示されます。

f:id:kuwazzy:20200504140837p:plain

SQLクエリの実行

本例で利用するGSheetsSchema内の「Budget_2020」テーブルは、以下のような年月毎の予算データが格納されているスプレッドシートとなります。

f:id:kuwazzy:20200504142950p:plain

また、KintoneShema内の「案件管理(営業支援パック)」は、kintoneのサンプルアプリで以下のように案件データが格納されています。

f:id:kuwazzy:20200504143241p:plain

それでは、DBVisualizerからGoogleSheetsの予算データとkintoneの案件実績データを一度に取得するSQLクエリを実行してみましょう。

SELECT
 G.年月,
 G.受注目標額 AS 予算,
 K.実績 AS 実績,
 TRUNC(K.実績 / G.受注目標額, 1) AS 達成率
FROM
 GSheetsSchema.Budget_2020 G
LEFT OUTER JOIN
 (SELECT CAST(FORMAT(受注予定日, 'yyyyMM') AS STRING) AS 年月, SUM(CAST(合計費用 AS DECIMAL)) AS 実績 FROM KintoneSchema."案件管理(営業支援パック)" GROUP BY "年月") K
ON
 G.年月 = K.年月
ORDER BY G.年月

※kintone側の「合計費用」は計算項目であるため文字列型として定義されてしまうので、CAST関数にて型を変換しています。

月毎の予算(GSheetsから取得)と実績(kintoneから取得)、達成率を取得出来ました。

f:id:kuwazzy:20200525164001p:plain

まとめ

いかがでしたでしょうか?複数の異なるデータソースをまとめて参照するには、データウェアハウスを構築するなどの手法がありますが、様々なリソース(お金・時間・スキル)が必要となります。それを解決する一つのアプローチがデータ仮想化というテクノロジーです。CData Query Federation Driver を使用すれば、Data Driverレベルでデータ仮想化を実現することが出来ることを理解頂けたのではないでしょうか。本記事の執筆時点(2020/05)では、本製品はベータ版というステータスですので、是非、「このようなユースケースで利用出来ないか?」といったご質問やご要望を受け付けておりますので、弊社サポートデスクまでお問い合わせください。