和結合ビューの作成

和結合ビューは、さまざまなビューのタプルを 1 つのビューにマージします。マージする各ビューは、互いに異なるデータベースに属していてもかまいません。

標準的な関係代数では、すべてのリレーションまたはテーブルは同じスキーマを持つ必要があります (同じ型の同じ属性であること)。Virtual DataPort では、標準的な関係代数として UNION 操作を提供します。ただし、Virtual DataPort には 拡張和結合 操作も用意されているので、ある入力ビューに存在する属性が他の入力ビューに存在しない場合、その属性が出力ビューに追加されます。

拡張和結合ビューの作成

拡張和結合ビューを作成するには、[Server Explorer] で右クリックして、[New] > [Union (extended)] の順にクリックします。

[Extended union view] ダイアログが開き、[Server Explorer] で選択したビューが追加されます。ビューを和結合ビューに追加するには、追加するビューを [Server Explorer] からこのダイアログにドラッグします。異なる複数のデータベースのビューをドラッグできます。

このマニュアルの例では、基本ビューの phone_incinternet_inc をドラッグします (これらのビューの作成方法については「 JDBC データソースからの基本ビューの作成 」を参照)。

[Extended union view] ダイアログには、以下の 6 つのタブがあります。

  1. Model: 和結合を構成するビューを、このタブにドラッグし、それらのビューのフィールド間にアソシエーションを確立します。アソシエーションでリンクした各フィールドは、ビューの出力スキーマで単独の属性と見なされます。

    デフォルトでは、名前と型が同じ属性間にアソシエーションが作成されます。また、あるビューの属性を他のビューの属性にグラフィカルにリンクすることによって、アソシエーションを追加することもできます。多数のフィールドが存在するビューでは、[Find] オプション (ビューを右クリックして表示) を使用して、ビューの中で目的のフィールドを見つけることができます。

    Design Studio では、アソシエーションが自動的に作成されなかった場合、ソースビュー右上の [link] ボタンをターゲットビューにドラッグすることによって、ビューどうしを接続できます。ビューを接続した後、[link] をクリックすると、[Model] タブの下部にダイアログが開き、両方のビューのフィールドが表示されます。このダイアログを使用して、左側のビューの属性を右側のビューの他の属性にグラフィカルにリンクすることでアソシエーションを追加します。

    Connecting two views with the Design Studio

    Design Studio を使用した、 internet_incphone_inc の接続

    2 つのフィールドを関連付けるには、それらが同じ型であるか、互いに互換性がある型であることが必要です。たとえば、 float 型フィールドは double 型フィールドと関連付けることができ、 int 型フィールドは long 型フィールドと関連付けることができます。

    和結合からビューを削除するには、ビュー右上にある image0 ボタンをクリックします。Design Studio では、ビュー左上にあるごみ箱ボタンをクリックします。

    このタブで、ダイアログ上部にある image1 をクリックすると、 ビューパラメーター を追加できます。ビューパラメーターの説明と、これを使用するために必要なルールについては、「 派生ビューのパラメーター 」を参照してください。

  2. Associations: フィールド間のアソシエーションのリストが表示されます。 image2 をクリックすると、アソシエーションを削除できます。

  3. Where Conditions: ビューの定義に WHERE 条件を追加できます。WHERE 条件を追加するモードとして以下の 2 つがあります。

    注釈

    現在、Design Studio では [Simple condition mode] を使用できません。デフォルトのモードは [Specify Where condition] です。今後、[Simple condition mode] オプションを追加する予定です。

    1. Simple condition mode: AND 演算子で結合した条件のリストを作成します。各条件では、左辺のオペランドとしてビューの属性を指定します。

      新しい条件を追加するには、 image3 をクリックします。条件ごとに以下を指定する必要があります。

      1. ビューの属性。

      2. 条件の演算子 (=<>contains など)。

        条件演算子の詳細については、『VQL ガイド』の「 比較演算子 」を参照してください。

      3. 右辺のオペランド。定数、ビューの属性、および関数を使用した任意の式を指定できます (『VQL ガイド』の「 条件と派生属性の関数 」を参照)。

        [Help] メニュー > [Functions list] の順にクリックすると、既存の関数のリストが表示されます。

        選択したフィールドの型に応じた定数を入力する場合、 image4 をクリックすることによって、条件に応じた [Value editor] を開くことができます。

        1. フィールドの型が text または xml の場合は、[Value editor] が開きます。

          このエディターでは、値が一重引用符 (') で囲まれます。値に一重引用符を使用している場合、[Ok] をクリックしてエディターを閉じるときにその値がエスケープされます。

        2. 選択したフィールドの型が複合型 (register または array) の場合は、[Compound value editor] (「 Compound Values Editor での条件の作成 」を参照) が開きます。

    2. [Specify Where condition] モード: 任意の条件を作成できます。たとえば、 OR 演算子や NOT 演算子を使用する場合や、条件の左辺のオペランドが式の場合に、このモードを使用する必要があります。Ctrl+Space キーを押すと、オートコンプリートリストが表示されます。正しい構文の式を作成するうえで、このリストが効果的です。

  1. Group By: ビューに GROUP BY フィールドを追加できます。そのためには、[Use group by] チェックボックスをチェックして、[All fields] リストでいずれかのビューのフィールドを選択し、[Add >>] をクリックします。

    複数のフィールドを選択するには、Ctrl キーまたは Shift キーを押しながらフィールドを 1 つずつクリックします。

    入力ビューに多数のフィールドが存在する場合は、Ctrl+F キーを押して検索ボックスを表示すると、それを使用して目的のフィールドを容易に探し出すことができます。

    フィールドの追加のほか、[Add expression] をクリックして Group By 式を定義できます。

    ビューの Group By 句のフィールドの順序を変更するには、[Selected group by fields and expressions] リストでフィールドを選択して image5 ボタンと image6 ボタンをクリックします。

    Group By のフィールドまたは式を 1 つまたは複数追加した後、[Having condition] ボックスで HAVING 条件を定義できます。

    [Output] タブで [New aggr. field] ボタンをクリックして集計式を定義できます。

    Group By フィールドを追加した場合、ビューには Group By フィールドと集計式のみを指定できることに注意してください (『VQL ガイド』の「 Group BY 句 」を参照)。

  2. Output: 次のようにビューの出力を構成します。

    1. ビューの名前を変更する。

    2. フィールドの名前を変更する。ビューに多数のフィールドが存在する場合は、Ctrl+F キーを押して検索ボックスを表示すると、それを使用して目的のフィールドを容易に探し出すことができます。

    3. 投影したフィールドを並べ替える。並べ替えるフィールドの型の横にあるチェックボックスをチェックして image5 または image6 をクリックすると、それぞれフィールドが上または下に移動します。

    4. レジスターフィールドのサブフィールドを投影する。レジスターフィールドを右クリックして [Project subfields of...] をクリックします。

      Virtual DataPort は、複雑な構造のデータ型を、 register 型 (image9 アイコン) および array 型 (image10 アイコン) でモデル化します。

      このタブでは、 register フィールドの内部フィールドを投影できます。そのためには、フィールドを右クリックして [Project subfields of...] をクリックします。レジスターのすべてのフィールドではなく、一部のみを投影するには、目的の各フィールドを右クリックして [Project subfield...] をクリックします。

      array フィールドの内容を投影するには、フラット化ビューを作成します (「 フラット化ビューの作成 」を参照)。

    5. フィールドをアルファベット順に並べ替える。フィールドのテーブルを右クリックして [Sort fields alphabetically] をクリックします。

    6. 派生属性を追加する。[New field] をクリックして式エディターを開きます。

      派生属性は、追加した後で [Field Type] 列の image1 をクリックすることによって編集できます。

      このエディターでは、新しいフィールドの名前と式を指定する必要があります。この式には、定数、投影したビューの属性、および関数を指定できます (『VQL ガイド』の「条件と派生属性の関数」を参照)。

      [Help] メニュー > [Functions list] の順にクリックすると、既存の関数のリストが表示されます。

      Ctrl+Space キーを押すと、オートコンプリートリストが表示されます。正しい構文の式を作成するうえで効果的です。

      派生フィールドを定義した後、フィールドの型が表示されているセルで image1 をクリックすると、その「ソース型プロパティ」を設定できます。ソース型プロパティの用途については「 基本ビューのスキーマの表示 」を参照してください。

    7. [Group by] タブで [Use group by] チェックボックスをチェックしていれば、[New. aggr. expression] をクリックすることでビューに集計式を追加できます。

    8. フィールドを削除する。削除するフィールドのチェックボックスをチェックして [Remove Selected] をクリックします。

      注釈

      複数のフィールドを一度に選択するには、選択範囲の最初のフィールドを選択してから、Shift キーを押したままで最後のフィールドを選択します。各フィールドを右クリックして [Drop] をクリックすることで、そのフィールドを削除することもできます。

    9. ビューの出力から 1 つまたは複数のフィールドを削除した後でそれらを復元する場合は、[Restore] > [Fields] の順にクリックします。[Restore Fields] ダイアログが開くので、出力に再度追加するフィールドを選択します。

      ビューの出力スキーマ全体をリセットする場合は、[Restore] > [Schema] の順にクリックします。これにより、ビューの Group by 定義が削除され、ソースビューのすべてのフィールドが [Output] に追加されます。

    10. 出力から重複行を削除する。[DISTINCT clause] チェックボックスをチェックします。

    11. 1 つまたは複数のフィールドを基準として出力を並べ替える。[ORDER BY fields] ドロップダウンでフィールドを選択して image3 をクリックします。ORDER BY フィールドを追加した後、出力を昇順 (ASC) または降順 (DESC) のどちらで並べ替えるかを選択します。

    12. ビューのプライマリキーを定義する。プライマリキーを構成するフィールドの型の横にあるチェックボックスをチェックして [Set selected as PK] をクリックします。フィールドを右クリックして [Set field as PK] をクリックすることでプライマリキーを定義することもできます。

      ビューのプライマリキーの詳細については、「 ビューのプライマリキー 」を参照してください。

    13. フィールドに説明を追加する。[Description] 列で image1 をクリックします。フィールドの説明は、以下の方法で取得できます。

      • JDBC インターフェイス

      • ODBC インターフェイス

      • Denodo のストアドプロシージャ CATALOG_VDP_METADATA_VIEWS。このプロシージャについては、『VQL ガイド』の「 CATALOG_VDP_METADATA_VIEWS 」を参照してください。

  3. Metadata: 新しいビューの格納先フォルダーと説明を定義します。

  4. [Save] (image17) をクリックします。

以下は Virtual DataPort Administration Tool を使用した手順の例です。

  • [File] メニュー > [New] > [Union (extended)] の順にクリックします。

  • phone_inc ビューと internet_inc ビューを [Model] タブにドラッグして、アソシエーション internet_inc.summary = phone_inc.description を追加します。「 Creating the union view of phone_inc and internet_inc ("Model" tab) 」を参照してください。

  • [Output] タブで以下の手順に従います (「 Creating the union view of phone_inc and internet_inc ("Output" tab) 」を参照)。

    • ビューの名前を incidents に変更します。

    • pinc_idiinc_idspecific_field1specific_field2 、および specific_field3 の各フィールドを削除します。そのためには、これらのフィールドを選択して [Remove selected] をクリックします。

    • taxid フィールドを使用してビューのプライマリキーを定義します。そのためには、 taxid の型の横にあるチェックボックスをチェックして [Set selected as PK] をクリックします。

つづいて、[Save] をクリックしてビューを作成すると、新しいビューのスキーマが表示されます。

Creating the union view of phone_inc and internet_inc ("Model" tab)

phone_incinternet_inc の和結合ビューの作成 ([Model] タブ)

Creating the union view of phone_inc and internet_inc ("Output" tab)

phone_incinternet_inc の和結合ビューの作成 ([Output] タブ)

以下は Design Studio を使用した手順の例です。

  • [File] メニュー > [New] > [Union (extended)] の順にクリックします。

  • internet_inc ビューと phone_inc ビューを [Model] タブにドラッグします。これらのビューが自動的にリンクされない場合は、 internet_inc ビュー右上の [link] ボタンをクリックして phone_inc ビューまでドラッグすることで、これらのビューを接続します。

  • アソシエーション internet_inc.summary = phone_inc.description を追加します。このアソシエーションを追加するには、2 つのビュー間のリンクをクリックし、下側のパネルで左側の summary フィールドをドラッグして右側の description フィールドにドロップします。「 Creating the union view of phone_inc and internet_inc ("Model" tab) 」を参照してください。

  • [Output] タブで以下の手順に従います (「 Creating the union view of phone_inc and internet_inc ("Output" tab) 」を参照)。

    • ビューの名前を incidents に変更します。

    • pinc_idiinc_idspecific_field1specific_field2 、および specific_field3 の各フィールドを削除します。そのためには、これらのフィールドを選択して [Remove] をクリックします。

    • taxid フィールドを使用してビューのプライマリキーを定義します。そのためには、 taxid 行の最後の列にある鍵アイコンをクリックします。

つづいて、[Save] をクリックしてビューを作成すると、新しいビューのスキーマが表示されます。

Creating the union view of internet_inc and phone_inc ("Model" tab) using the Design Studio

Design Studio を使用した、 internet_incphone_inc の和結合ビューの作成 ([Model] タブ)

Creating the union view of internet_inc and phone_inc ("Output" tab) using the Design Studio

Design Studio を使用した、 internet_incphone_inc の和結合ビューの作成 ([Output] タブ)

標準和結合ビューの作成

管理ツールを使用して標準和結合を作成するには、以下の手順に従います。

  1. [File] メニュー > [New] > [Union (standard SQL)] の順にクリックします。

  2. [Model] タブで以下の手順に従います。

    • ビューをこのタブにドロップします。それぞれのビューのフィールドの数が同じである必要はありません。

    • 最初に追加したビューは、和結合の「左側ビュー」と見なされます。このビューは太い境界線で強調表示されます。

    • この新しいビューのスキーマは、左側ビューのフィールドのうち、他のビューのフィールドとリンクしているフィールドで構成されています。リンクしていないフィールドは和結合では使用されません。

    • すべてのビューのフィールドをリンクすると、アソシエーションが完成します。リンクしているフィールドは太字で強調表示されます。それらのフィールドの「代表」フィールドである左側ビューのフィールドは、[Where Conditions] タブで条件に使用すること、[Group by] タブで Group by フィールドとして使用するか Having 条件に使用すること、または [Output] タブで投影することができます。

      • アソシエーションでリンクしていないフィールドがあると、フィールドが赤で強調表示され、アソシエーションを完成するか削除するかの判断を求めるメッセージが表示されます。

      • 他のフィールドと関連付けられていないフィールドは、和結合では使用されません。したがって、それらのフィールドは無視され、[Where Conditions] タブ、[Group By] タブ、[Output] タブのいずれでも使用できません。

      • 左側ビューの各フィールドは元の順序で投影され、他のビューの各フィールドは、指定したアソシエーションに合わせて並べ替えられます。

  3. [Associations]、[Where Conditions]、[Group By]、および [Metadata] の各タブの動作は、他の派生ビューの場合と同じです。

  4. [Output] タブ: このウィザードでは、デフォルトで UNION ALL ビュー (重複行が削除されていないビュー) が作成されます。重複行を削除した UNION を作成するには、[Union ALL] チェックボックスのチェックをはずします。

注釈

可能な限り UNION ALL を選択するよう考慮してください。デフォルトの UNION である UNION DISTINCT を使用する場合、最も重要な 2 つのクエリの書き換え (集計プッシュダウンと結合-和結合プッシュダウン) を実行できなくなります。その理由は、UNION では暗黙的に DISTINCT 操作が実行されるため、JOIN 操作や GROUP BY 操作の計算をすると、その結果は、一般的に DISTINCT 前後で等価にならないためです。

以下に例を示します。

Creating the standard union view of customer and supplier ("Model" tab)

customersupplier の標準和結合ビューの作成 ([Model] タブ)

上記のスクリーンショットでは、ウィザードに 2 つのビューが追加されています。ここから以下の UNION ALL が生成されます。

SELECT customerid, customername, contactname FROM customer
SQL UNION ALL
SELECT supplierid, suppliername, contactname FROM supplier
Note that address is not included in the UNION.

ここで、たとえば、何らかの WHERE 条件を追加し、Group By を有効にして、新しい集約フィールドを追加すると、以下のようなステートメントを記述できます。

SELECT count(*) FROM (
    SELECT customerid, customername, contactname FROM customer
    SQL UNION ALL
    SELECT supplierid, suppliername, contactname FROM supplier
) WHERE customername like 'someregex' GROUP BY customername

分割和結合ビューの作成

論理データウェアハウスのシナリオでは、ファクトテーブル (およびディメンションがあることがも考えられます) のデータが 2 つの別のシステムに存在することが多く見られます。たとえば、小売企業の売上に関する情報が、エンタープライズデータウェアハウスと Hadoop に基づくデータレイクの 2 つのシステムに保存されているとします。この場合、すべての売上情報を扱う標準的なビューを作成するために、両方のテーブルの和結合として定義したビューを、名前を sales として Denodo で作成できます。

ただし、各システムには、以下に示す一定の基準で定義した固有なデータが存在することがわかっています。

  • エンタープライズデータウェアハウスには、今年の売上データが保存されている。

  • Hadoop に基づくデータレイクには、昨年までの売上データが保存されている。

したがって、たとえば 2016 年の売上を要求するクエリの場合、過去の年の情報はデータレイクにのみ存在することがわかっているので、データウェアハウスシステムにアクセスすることは不要であり、効率的でもありません。このような場合、Denodo に分割基準を通知する手順が別途必要です。この分割和結合を構築するには以下の手順に従います。

  • 各分割から、その分割が満たす条件を収めた中間選択ビューを作成します。

  • これらの中間選択の和結合を作成して、目的の和結合とします。

このマニュアルの例では、この条件は以下のようになります。

  • year = getyear(CURRENT_DATE): データウェアハウス用の条件

  • year < getyear(CURRENT_DATE): データレイク用の条件

これにより、一部の分割と互換性のないフィルター条件をクエリで指定すると、その状況がクエリオプティマイザーで検出され、そのクエリに不要な和結合のすべての分岐が除外されます。前述の例でいえば、クエリに条件 year = 2016 を指定している場合、条件 year = getyear(CURRENT_DATE) には現在の選択との互換性がないことが検出され、互換性がある分割のみが Hadoop システムにアクセスする分割となります。

最後に、既存のフィールドに分割基準が定義されていないことが考えられます。たとえば、世界中で製品を販売する企業の売上情報が、以下の 3 つのシステムに分割されているとします。

  • EMEA (欧州、中東、アフリカ) の情報を保存するシステム

  • アメリカの情報を保存するシステム

  • APAC (アジア太平洋) の情報を保存するシステム

この場合の分割は地域別ですが、sales には地域を指定する列が存在しません。分割和結合を実現するために、ビューパラメーターを使用して中間選択を作成する方法があります。このシナリオの例については、「 派生ビューのパラメーター 」を参照してください。