はじめに

Qlik Sense / QlikViewは「インメモリ」にデータを取り込んでで高速な分析を行えることが製品の大きな特徴ですが、ビッグデータの膨大なデータに対して直接接続を行う「ダイレクト・ディスカバリ(Direct Discovery)」という機能も併せて標準で提供されています。

image

この機能により、例えばコスト・ベネフィットの観点からデータ容量が巨大となる明細レベルのデータについてはインメモリで分析を行わずにソースのシステムに対して都度問い合わせを行って取得するようにするなど、データ活用方法について手段を選択することができます。

データソースとしては、SQL Server, Oracle, TeradataなどのRDBMS、Hadoop(Cloudera/Mapr/Horton)、 Redshift、Google BigQuery、SAP Hana、HP Verticaなどが対象として想定されます。

ダイレクト・ディスカバリではインメモリとの「ハイブリッド」なアプローチを採用しており、以下の様にビッグデータは元システムに直接参照し、他システムやExcelファイルのデータはメモリに取り込んで、これらのデータを一つのデータモデルとして繋ぎ合わせて分析対象とすることができます。また、Qlik Sense / QlikViewの特徴である「連想技術」を使った分析も可能となっています。

image

過去の以下のエントリではダイレクト・ディスカバリの機能を利用してRedshiftのデータを分析する手順についてご説明しました。

今回は、よりダイレクト・ディスカバリの機能やその仕組みの理解にフォーカスしたご説明をしたいと思います。尚、今回はデモにQlik Senseを利用しますが、QlikViewでも同様のダイレクト・ディスカバリ機能が提供されています。

デモ環境準備

このエントリでのご説明は、以下が導入されたデモ環境での操作手順に沿ってご説明を行います。

「Microsoft® SQL Server® 2012 SP2 Express」の導入

以下のサイトからダウンロードが可能となっています。

http://www.microsoft.com/ja-jp/download/details.aspx?id=43351

デモ環境ではSQL Server 2012 Management StudioとSQL Serverが含まれた「SQLEXPRWT_x64_JPN.exe」を導入して利用しています。

「AdventureWorks」のサンプルデータベース準備

以下からAdventureWorksのサンプルデータベースがダウンロード可能となっています。

http://msftdbprodsamples.codeplex.com/downloads/get/478214

こちらをダウンロードの上、Microsoft SQL Serverへデータベースのアタッチを行ってください。このサンプルデータを利用してダイレクト・ディスカバリの実装を行います。

SQL ServerへのODBCデータソースの作成

「SQL Server」のドライバを利用してODBC(64bit)データソースを作成します。このデモでは「Adworks」という名称で作成しています。

image

Qlik Sense Desktopの導入とデータ接続の作成

Qlik Sense Desktopを導入されていない場合には、以下からダウンロードが可能です。(当手順はQlik Sense 1.1で確認を行っています。)

image 

Qlik Senseを導入後、SQL ServerのAdventureWorksデータベースに対してQlik Senseからデータ接続の定義を行います。

任意の名称でアプリの新規作成を行い、データロードエディタを開いて「ODBC」の「データ接続」を新規作成します。

image

作成済みの「Adworks」のODBCデータソースを選択して「保存」をクリックします。

image

以降でご説明する手順は、このアプリケーション上で実施します。

基本的なダイレクト・ディスカバリの実装

では、まずダイレクト・ディスカバリを使って「SalesOrderHeader」テーブルのデータを分析するための手順をご説明します。

Direct Discovery処理の作成

データロードエディタから作成済み「Adworks」データ接続の「データを選択」アイコンをクリックします。

image

データベースから「AdventureWorks2012」、所有者から「Sales」を選択して「SalesOrderHeader」テーブルのチェックボックスをONにします。「ロードステートメントを含める」のオプションをOFFにして「スクリプトを挿入」ボタンをクリックします。

image

ロードスクリプトが追加されます。

image

ロードスクリプトを以下の様に修正します。


SET DirectTableBoxListThreshold = 1000000;
DIRECT QUERY
DIMENSION
    SalesOrderID,
    CustomerID,
    SalesPersonID,
    TerritoryID,
    OrderDate
MEASURE
    SubTotal,
    TaxAmt,
    TotalDue
DETAIL
    rowguid,
    ModifiedDate
FROM AdventureWorks2012.Sales.SalesOrderHeader; 

「データのロード」ボタンをクリックしてロードを実行します。

image

ロードの実行が成功したことを確認して「閉じる」をクリックします。

image

「データモデルビューア」をクリックします。

image

以下の様なデータモデルが表示されます。テーブルの左上のデータベースアイコンは、このテーブルがDirect Discoveryテーブルであることを示しています。

image

チャート動作と実行されるSQLクエリの確認

ここでは、チャートとテーブルを作成して動きの確認を行うとともに、少し細かい内容となりますが、裏でソースシステムに対して実行されるSQLクエリについて確認してみたいと思います。

メニュー左上のナビゲーションから「アプリの概要」をクリックします。

image

「シートの新規作成」をクリックしてシートを作成し、新たに作成したシートを開きます。

image

「項目」タブを開き、項目をクリックしてプロパティを開くと、DIRECT QUERY文で指定された項目の種類を確認することが出来ます。以下では、「CustomerID」は「DIMNSION」として取り込まれていることが分かります。

image

編集モードをONにして、棒グラフとフィルタをシートに追加します。棒グラフの軸に「TerritoryID」、メジャーに「Sum([SubTotal])」を設定します。また、「CustomerID」をフィルタとして追加し、以下の様なチャートを作成します。

image

フィルタで条件を絞り込むと以下の様にチャートの表示が変更されます。以下の例では「CustomerID」を11000、11001、11002の3つに絞り込んでいます。

image

この時、Qlik Senseからソースシステムに対して送信されているSQLクエリがどのようになるか確認してみましょう。(Microsoft SQL Serverでは「SQL Server Profiler」ツールを使って確認が可能です。)

  • 「仮想技術」の考え方に従って項目間のアソシーエーションを行うためのクエリが実行されています。この例では、選択した「CustomerID」に紐付く、棒チャートの軸として設定されている「TerritoryID」をクエリで取得しています。

image

  • また、選択した「CustomerID」で絞り込みを行って、チャート集計に必要となる「TerritoryID」毎にGROUP BYした「SubTotal」の集計値と、合計値をクエリで取得しています。

image

次にテーブルを追加して、「CustomerID」と「OrderDate」を列に追加してみます。

image

この時、まず追加した列項目のレコード数をCOUNT(*)で取得するSQLクエリを実行しています。ここでは、後段でご説明する「DirectTableBoxListThreshold」の制限値を超えないか確認を行います。その後にレコードをSELECT文で取得しています。

image

尚、これらのクエリ実行中でチャートやテーブルの表示待ちとなっている間には以下の様な「キャンセル」ボタンが表示されますので、このボタンをクリックすることで表示をキャンセルすることができます。

image

ダイレクト・ディスカバリの基本的な処理の解説

以上、下記のスクリプトを作成してダイレクト・ディスカバリを実装しました。次にこのスクリプトの内容について解説したいと思います。

image

DIRECT QUERY

インメモリにデータを取り込む場合には「SQL SELECT」で始まりますが、この「DIRECT QUERY」で開始した場合にはダイレクト・ディスカバリのステートメントとして扱われます。

DIMENSION

「DIMENSION」の下に幾つか項目が列挙されていますが、これらの項目は以下に示されるようなシート上での「フィルタ項目」や演算を行う「軸」として利用することが出来ます。

image

「DIMENSION」として指定された項目はリロード実行時に以下の様に「Select Distinct」のクエリが実行され、結果として返された一意のレコードがインメモリ格納されます。

image

これは、例えば「フィルタ項目」のデータは選択を行うために常にユーザーインターフェース上に表示させる必要がありますが、もしこれらについてもソースシステムに対して都度クエリを発行して全件取得するとパフォーマンス上のオーバーヘッドとなってしまいます。これらのデータについてはインメモリに格納することで、不要なクエリを都度ソースシステムに送信しないよう工夫されています。

MEASURE

「Measure」は「Sum/Min/Max/Avg/Count」といった集計の対象となる項目が対象となります。これらのデータはインメモリには取り込まれず、列名といったメタ情報のみが取り込まれます。「Measure」項目の集計処理についてはソースシステムに対してリクエストが実行され、その結果のみをQlik Senseでは表示します。

DETAIL

「Detail」に指摘される項目は、集計処理の対象とはせず、明細データとしてテーブルにそのまま表示させるものが対象となります。これらのデータもインメモリには取り込まれません。

尚、既定では1,000行がテーブルに表示する上限値として設定されており、その上限値を超えると「Direct Discovery 行数のオーバーフロー」のエラーが出力されます。

image

上限値を変更するには以下の処理をロードスクリプトに追加して、再ロードを実行する必要があります。

SET DirectTableBoxListThreshold = 1000000;

image

DETACH

今回の例では使用しませんでしたが、DETACH句を利用して対象項目を連想(アソシエーション)から切り離して利用することが可能です。

Qlik Senseでは連想(アソシエーション)の技術により、例えば以下の様に「OrderDate」のフィルタで絞り込みを行うと、「CustomerID」や「SalesOrderID」では結びつきのあるレコードのみが白、結びつかないレコードはグレーで表示されます。

image

ロードスクリプトで「DETACH」を追加し「SalesPersonID」を含めます。

image

そうすると、以下の様に「DETACH」に指定された「SalesPersonID」はアソシエーションから切り離され、他のフィルタでデータが絞り込まれても、「SalesPersonID」では白・グレーの表示変更が行われないようになります。

image

ただし、「SalesPersonID」でデータの絞り込みを行うと、その選択条件はWHERE句でその条件が指定されてデータソースに対してクエリの実行が行われます。アソシエーションによるパフォーマンスへの影響を抑えて、フィルタによるシンプルな選択の絞り込みのみを行いたい場合には有効な方法となります。

まとめ

以上、ダイレクト・ディレクトリの概要および基本的な使い方について説明を行ってきました。次のエントリでは複数テーブルの構成など、より高度な利用方法について見ていきたいと思います。後編へのリンクは以下となります。

>Qlik Sense 「ダイレクト・ディスカバリ」を使ったビッグデータ分析(後編)