レベル: 中級 播磨 直寛 (nharima@jp.ibm.com), 情報マネジメント技術/ソフトウェア開発研究所, IBM
2005年 9月 30日 今月はAlphabloxに焦点を当てて解説していきます。
Alphabloxキューブと多次元分析
DB2 Alphabloxでリレーショナルデータベース(RDB)をデータソースとして分析を行う場合、多次元分析用データモデル(ディメンション・スキーマ)を定義することで多次元分析を行うことが可能となります(*1)。多次元分析はAlphabloxの最も得意とする分野で、Dynamic HTMLにより画面全体をリフレッシュすることなく表示の切り替えを行い、スムーズな分析作業を行うことが可能となります。ここではRDBに格納されたデータを多次元で表示するビューを提供するAlphabloxキューブを用いて多次元分析を行う方法について解説します。
RDBを用いる場合、具体的には以下の手順により多次元分析を行うことが可能となります。
- 多次元分析に用いるRDBデータソースのDB2 Alphabloxへの登録
- キューブ・モデルおよびキューブの定義(DB2 Cube Viewsを使用)
- DB2 Alphabloxによるキューブ作成(DB2 Cube Viewsで作成したキューブのインポート)
- 3で作成したキューブを使用するためのAlphablox Cube Server Adapterの登録
- 3で作成したキューブの開始
- 4で作成したアダプターを通して3で作成したキューブへの照会を行うアプリケーションの作成
それぞれの手順における詳細は各製品のドキュメントにゆだねますが、本稿ではこれら手順の流れとポイントについて解説し、実際に多次元分析用アプリケーションを作成することでAlphabloxキューブの活用方法をご紹介します。
なお、ここで構築するDB2 Alphabloxアプリケーションと多次元分析用RDBデータソースとの関係は図1のイメージとなります。
*1 多次元分析に用いられるディメンション・スキーマについての詳細は次のサイトをご参照ください。
http://publib.boulder.ibm.com/db2blox/82/ja/cube/cube13.htm
図1 DB2 AlphabloxアプリケーションからAlphabloxキューブへの照会イメージ
多次元分析に用いるRDBの登録(手順1)
まず初めに、キューブ・モデルの定義を行うRDBをDB2 Alphabloxに登録します(*2)。登録方法の詳細は以下のサイトをご参照ください。
http://publib.boulder.ibm.com/db2blox/82/ja/cube/cube17.htm
*2 データソースとしてRDBを直接指定するのではなく、アプリケーション・サーバーで定義されるコネクションプールを指定することで照会パフォーマンスの向上を図ることが可能です。このとき使用するデータソースにはアプリケーション・サーバーで定義されたデータソースのアダプターとしてApplication Server Data Sourceを指定します。詳細は、「IBM DB2 Alphablox 管理者用ガイド」における「接続プールの使用」の項目をご参照ください。
キューブ・モデルおよびキューブの定義(手順2)
Alphabloxキューブを作成する方法はいくつかありますが、ここではDB2 Cube Viewsを用いてキューブの定義を行い、この定義をインポートしてAlphabloxキューブとして登録して使用する方法をご紹介します。
データベースからキューブ・モデルを作成するにはディメンション・スキーマの形式でデータを準備する必要があります。また、ディメンション・スキーマを作成した後、DB2 Cube Viewsのキューブ・モデルを作成し、最後にキューブを作成します。 DB2 Cube Viewsのキューブ・モデルでは次の項目を定義します。
- ファクト・オブジェクト(計測項目)
- ディメンション(分析軸)
- ディメンションの階層
- ディメンションの階層におけるレベル
上記の項目についてキューブ・モデルを定義した後、この定義を用いてキューブを作成します。詳細は以下のサイトをご参照ください。
http://publib.boulder.ibm.com/infocenter/db2help/topic/com.ibm.db2.udb.db2_olap.doc/tcreatecmobjects.htm
(参考) DB2 Cube Viewsがインストールされている場合、以下のディレクトリにCube Viewsのサンプルがありますので、これを用いることでAlphabloxキューブに取り込めるデータを簡単に作成することができます。 [DB2_HOME]\samples\olap\cvsample
Alphabloxキューブの作成(手順3)
DB2 AlphabloxではCube Viewsで作成したキューブをAlphabloxキューブの定義としてインポートする機能があります。ここではDB2 Cube Viewsで作成したキューブをDB2 Alphabloxにインポートして使用します。なお階層型にはいくつか種類がありますが、ここでは最も基本となる平衡型を用いて説明します(*3)。 図2は実際にDB2 Cube Viewsで定義されているキューブをDB2 Alphabloxキューブとしてインポートを行った際の画面です。
図2 DB2 Cube ViewsからAlphabloxキューブへのキューブ定義のインポート
DB2 Cube Viewsで定義されたキューブをAlphabloxキューブとしてインポートする手順については次のサイト(特に手順9)をご参照ください。
http://publib.boulder.ibm.com/db2blox/82/ja/cube/cube18.htm
*3 DB2 Cube Viewsでサポートされる階層型についてさらに知りたい方には次のサイトが参考になります。
http://publib.boulder.ibm.com/infocenter/db2help/topic/com.ibm.db2.udb.db2_olap.doc/cmdhierarchy.htm
Alphabloxキューブを使用するためのAlphablox Cube Server Adapterの作成(手順4)
上記手順で作成したキューブに対して照会を行うためにはAlphablox管理画面でAlphabloxキューブ照会用のアダプターを登録する必要があります(図1参照)。詳細な手順は次のサイトの「Alphablox Cube Server Adapter データ・ソースの作成」の項目を参照して設定を行ってください。ここではAbxCubeという名前のアダプターを作成して使用します。
http://publib.boulder.ibm.com/db2blox/82/ja/cube/cube21.htm
Alphabloxキューブの開始(手順5)
作成したAlphabloxキューブを開始することで、DB2 Alphabloxアプリケーションから照会可能となります。キューブの開始はWebブラウザからDB2 Alphablox管理サイトでから方法と、Alphabloxの提供するコンソールから行う方法とがあります。 詳細な手順は次のサイトをご参照ください。
http://publib.boulder.ibm.com/db2blox/82/ja/cube/cube25.htm
Alphabloxキューブを用いたアプリケーションの作成(手順6)
最もシンプルなDB2 Alphabloxアプリケーションの作成
作成したキューブに対して照会を行うアプリケーションのコードをJSPファイルに記述します。照会文、およびデータソースはタグ中に記述することもできますが、ここでは動的に変更できるようスクリプトレットにより照会文とデータソースを指定しています。なお、キューブに対して照会を行う際にはMDX(Multidimensional Expressions)という多次元分析用照会言語を使用します。AlphabloxはこのMDXをSQLに書換え、RDBに対して照会を行います。 (DB2 Alphabloxアプリケーションを作成する方法については「リレーショナルデータベースを利用したAlphabloxアプリケーション開発ガイド(1)」を参照してください)
以下、コードについて説明します。
最初の4行では、言語の設定、およびDataBloxを使用するためのtaglibの設定をしています。DataBloxはデータソースへの照会を行うために必須となります。
- "blox_data"というidのDataBloxを定義しています。データソースおよび照会文はスクリプトレットで指定するため、タグ中には定義しません。
- (1)で定義したDataBloxを使用するPresentBloxを"blox_present"というidで定義しています。この時点では"visible=false"と指定することで表示されないよう指定します。
- スクリプトレットの中でデータソースと照会文を指定します。データソースは先ほどAlphabloxで登録したAlphablox Cube Server Adapterの名前「AbxCube」を指定します。照会文は、ここでは上記で作成したキューブ「CarSalesCube」について照会を行う最もシンプルなMDXを記述しています。次に、定義したDataBloxに対してデータソース名および照会文をAPIによりセットし、接続を行います。MDXの記述に関する詳細は「DB2 Alphablox Cube Server 管理者用ガイド」における「サポートされる MDX 構文」の項目をご参照ください。
- 最後に<blox:display>タグですでに定義したPresentBloxの名前を指定し、PresentBloxの内容を表示させます。
<%@ page language="java"
contentType="text/html; charset=utf-8"
pageEncoding="Shift_JIS"%>
<%@ taglib uri="bloxtld" prefix="blox"%>
<blox:header/>
<blox:data id="blox_data" - (1)
connectOnStartup="false">
</blox:data>
<blox:present id="blox_present" - (2)
height="500"
width="100%"
visible="false">
<blox:data bloxRef="blox_data"/>
<blox:grid/>
<blox:chart/>
</blox:present>
<% - (3)
//データソースとステートメントを指定
String dataSource = "AbxCube";
String stmt = "SELECT FROM [CarSalesCube]";
//DataBloxに対してデータソースをセット
blox_data.disconnect(true);
blox_data.setDataSourceName(dataSource);
//DataBloxに対して照会文をセットして接続
blox_data.setQuery(stmt);
blox_data.connect();
%>
</head>
<body>
<blox:display bloxRef="blox_present"/> - (4)
</body>
</html>
|
上記コードの出力結果は図3のようになります。
図3 最もシンプルなアプリケーションの出力結果
アプリケーションの改良
次に図3の出力を行うアプリケーションを改良し、さらに分析を行いやすいアプリケーションを作成します。ここでは上記コードについて以下の方針で変更を行うものとします。 変更方針
- 表では横軸に時間を、縦軸に製品を表示させる
- 利益の累計を製品全体について算出する
- 上記累計をグラフに折れ線グラフの形式で表示させる
- 表内の数値を3桁区切りで表示させる
どのように実装すれば上記変更方針を満たすことができるか、次のコードで確認してください。
- 変更方針2を実現するため、calculatedMembersでRunningTotal関数を用いることで製品全体の売上について累計を算出しています。ここでは横軸の時間について累計を算出しています。ここでは製品累計のみを表示させ、製品の合計については標示を行わないようhiddenMembersプロパティにより製品ディメンションを指定しています。
- 変更方針4を実現するため、表内の表示フォーマットが3桁区切りになるよう指定しています。
- グラフのタイプを「垂直バー、横並び、双軸」で設定しています。
- 凡例として「製品」に含まれるメンバーを表示させています。
- 変更方針3を実現するため、折れ線グラフで表示させるデータとして(1)のcalculatedMembersで算出した「製品累計」を指定しています。
- 世代フィルターとして「すべての世代を表示」するよう指定しています。
- Y1軸を使用するデータとして製品軸のメンバー(A.トラック, A.スポーツ, A.セダン, A.ワゴン, A.福祉車両)を指定しています。
- Y1軸のタイトルを指定しています。
- Y2軸を使用するデータとして、(1)で算出したメンバー「製品累計」を指定しています。
- Y2軸のタイトルを指定しています。
- 変更方針1を実現するため、横軸(COLUMNS)に時間を、縦軸(ROWS)に製品を表示させるMDX照会文を記述しています。
<%@ page language="java"
contentType="text/html; charset=Shift_JIS
pageEncoding="Shift_JIS"%>
<%@ taglib uri="bloxtld" prefix="blox"%>
<blox:header/>
<blox:data id="blox_data" - (1)
connectOnStartup="false"
hiddenMembers="[CarSalesCube].[製品]:[CarSalesCube].[製品]"
calculatedMembers="[CarSalesCube].[製品] : 製品累計 { : 3 :
missingIsZero } = RunningTotal( [CarSalesCube].[製品] ,
[CarSalesCube].[時間] , 3 , GROUPDIM )">
</blox:data>
<blox:present id="blox_present"
height="500"
width="100%"
visible="false">
<blox:data bloxRef="blox_data"/>
<blox:grid - (2)
defaultCellFormat="#,##0;[赤]-#,##0"/>
<blox:chart
chartType="Vertical Bar, Side-by-Side, Dual Axis" - (3)
XAxis="時間"
legend="製品" - (4)
lineSeries="\"製品累計\"" - (5)
totalsFilter="0" - (6)
y1Axis="A.トラック, A.スポーツ, A.セダン, A.ワゴン, A.福祉車両" - (7)
y1AxisTitle="製品" - (8)
y2Axis="製品累計" - (9)
y2AxisTitle="製品累計"/> - (10)
</blox:present>
<%
//データソースを指定
String dataSource = "AbxCube";
//ステートメントを指定
//以下は横軸(COLUMNS)に時間を、縦軸(ROWS)に製品を表示させるMDX照会文
String stmt = " SELECT {[CarSalesCube].[時間].[2005].Children}"
+ "ON COLUMNS, " - (11)
+ "{[CarSalesCube].[製品].Children, [CarSalesCube].[製品]} ON ROWS "
+ "FROM [CarSalesCube]"
+ "WHERE ("
+ "[CarSalesCube].[Measures].[利益],"
+ "[CarSalesCube].[販売促進],"
+ "[CarSalesCube].[シナリオ],"
+ "[CarSalesCube].[地域])";
//DataBloxに対してデータソースをセット
blox_data.disconnect(true);
blox_data.setDataSourceName(dataSource);
//DataBloxに対して照会文をセットして接続
blox_data.setQuery(stmt);
blox_data.connect();
%>
</head>
<body>
<blox:display bloxRef="blox_present"/>
</body>
</html>
|
上記コードの出力結果は図4のようになります。
図4 出力結果
まとめ
本稿ではAlphabloxキューブを使用するに当たって必要な手順としてDB2 Cube Viewsを利用してAlphabloxキューブと連携を行う手法、そしてAlphabloxキューブを用いて多次元分析を行うアプリケーションを開発する方法をご紹介しました。
優れた操作性と開発における柔軟性を持つDB2 Alphabloxと、RDBからディメンション・スキーマを構築する上で重要な役割を果たすDB2 Cube Viewsとの連携によりAlphabloxキューブを使用するアプリケーションの活躍の場はまだまだ広がります。DB2 Alphablox Cube Server 管理者用ガイドや他のDB2 Alphabloxガイドを参考にして、分析に最適なアプリケーションを作成してください。
参考文献
以下のドキュメントはDB2 Alphablox Libraryに含まれています。
以下はDB2 Cube Viewsの設計に関する資料です。
著者について  | |  | 播磨 直寛はソフトウェア開発研究所のエンジニアで、Business Intelligenceの分野におけるプロジェクトでの開発・支援業務を担当しています。 |
記事の評価
|