MAQL DDL
Multi-Dimension Analytical Query Language (MAQL) は、GoodData のレポート作成で使用される、簡単でありながら強力なクエリ言語です。 MAQLの拡張である MAQL DDL (MAQL データ定義言語) は、データモデルの構築や変更で使用されます。
ほとんどの MAQL DDL では、変更の場合に SYNCHRONIZE
コマンドを使って基礎である物理データモデルを更新する必要があります。 例外:
- 表示値を変更する
- フォルダを管理する
CASCADE
キーワードを使用すると、LDM の変更はプロジェクト全体でカスケードされます。 従属オブジェクトもCASCADE
でドロップされます。 CASCADE
を使用しない場合、ファクトと属性はドロップされません。
同期されるデータセットからデータが削除されないようにするには、PRESERVE DATA
キーワードを使用します。 PRESERVE DATA
は、SYNCHRONIZE
でのみ機能します。 SYNCHRONIZE
を PRESERVE DATA
なしで実行した場合、同期されるデータセットからデータが削除されます。 詳細については、Synchronizeを参照してください。
はじめに
DDL 構文は、データベースユーザーにとってはなじみ深く、簡単なものです。 主要なコマンドは次の3つです。
- CREATE
- ALTER
- DROP
これらのコマンドは、次のようなデータモデルを形成するオブジェクトに適用されます。
- データセット: データの単一結合によるソース。属性とファクトにより構成。
- 属性: すべての文字列のように追加できないデータのコンテナ、および一部の列 (ID や SSN など)。
- ファクト: 計算データを含むデータ列 (価格、金額など)。
- フォルダー: GoodData プロジェクト内で、ユーザーに対して属性とファクトを視覚的に整理するために使用。
CloudConnect 経由の MAQL DDL
CloudConnect Designer の LDM Modeler を使って、データモデルを変更し、それらの変更を GoodData プロジェクトにパブリッシュできます。 CloudConnect Designer を使って変更を行うと、そうした変更は、GoodData プロジェクトに対して実行される際に MAQL DDL コマンドに変換されます。
CloudConnect Designer では、視覚的なツールを操作して DDL コマンドを作成します。 LDM Modeler で MAQL タブをクリックすると、実行中の MAQL DDL が表示されます。 また MAQL DDL は、CloudConnect Designer のモデル検証ツールにより、論理データモデル (LDM) を変更する場合に望ましい方法となっています。
詳細については、CloudConnect Tool を使用したデータモデリングを参照してください。
API 経由の MAQL DDL
REST API インターフェイスを経由して MAQL コマンドを直接使う場合には、次の URLを使用します。
http://secure.gooddata.com/gdc/md/<project>/ldm/manage2
<project>
の値を、GoodData プロジェクト ID に置き換えてください。 テキストフィールドには、複数のコマンドを入力できます。 これらはすべて単一トランザクションの一部として実行されます。 仮に 1 つでもコマンドが実行できなかった場合、すべてが適用さません(ロールバック)。
識別子
次の MAQL スクリプトのサンプルでは、波括弧 ({ }) で囲まれた語は識別子を表します。 これらは、他のオブジェクトを参照するように、オブジェクトに割り当てられることができる人間が読み取り可能な ID を考えます。
オブジェクトの作成後、この識別子は変更できません。 識別子については、命名規則を選択できます。 識別子には、英数字、アンダーバー (_)、ドット (.) が使用できます (すなわち、[A-Za-z0-9_.]
)。
下の例では、識別子で「folder.」や「fact.」などのプレフィクスが付けられることがよくあります。
データ列の識別子については、特定の命名規則に従う必要があります。 これらの識別子は、APIを通じてアップロードし、3NF で構築されるデータファイル内の特定のデータ列を参照します。 この識別子は、file.column
の形式を取る必要があります。 file
の部分でデータファイルを指定し、column は特定の列を指定します。 3NF で1つの共通ファイルを共有する列はすべて、識別子でも同じプレフィックスを共有する必要があります。 下の例では、データ列の識別子が強調表示されています。
同期
どのコマンドも、データの正式な表現を定義する論理データモデル を変更します。 この抽象レイヤーの下には、GoodData が計算に使用する 物理データモデルがあります。
MAQL DDL を使って変更を適用したら、SYNCHRONIZE
コマンドを呼び出して、それらの変更を物理データモデルに適用します。 視覚的な変更 (名前、説明、フォルダー内のメンバーシップ) は物理モデルに同期する必要はありません。
SYNCHRONIZE
キーワードを使用する場合は必ず、PRESERVE DATA
キーワードを使用し、プロジェクトからデータが削除されないようにします。
SYNCHRONIZE {dataset.one}, {dataset.two} PRESERVE DATA;
データセット
データセットは、属性とファクトの名前付きコンテナです。
CREATE DATASET
CREATE DATASET {dataset.quotes} VISUAL (TITLE "Stock Quotes Data");
ALTER DATASET
属性/ファクトの追加
ALTER DATASET {dataset.quotes} ADD {attribute.sector};
属性/ファクトの削除
ALTER ATTRIBUTE {attr.players.age} DROP KEYS {d_players_age.id}, {f_players.age_id};
ALTER DATASET {dataset.players} DROP {attr.players.age};
DROP {attr.players.age};
SYNCHRONIZE {dataset.players} PRESERVE DATA;
データセットの名前の変更
ALTER DATASET {dataset.quotes} VISUAL(TITLE "Internal Quotes Data");
属性またはファクトは1つのデータセットに属していなければなりません。 属していない場合、プロジェクトの検証が失敗します。
日付ディメンション
GoodData では、あらかじめ日付ディメンションのデータセットが用意されています。 プロジェクトの論理データモデルの作成/変更時に、これらのデータセットを MAQL DDL で使用できます。
日付ディメンションのインポート
プロジェクトで日付ディメンションが1つだけ必要な場合には、次のコマンドを実行します。
INCLUDE TEMPLATE "URN:GOODDATA:DATE";
ALTER ATTRIBUTE {date} ADD KEYS {f_quotes.date};
最初のコマンドでデータセットをプロジェクトにインポートし、2番目のコマンドでこのデータセットをファクトテーブル f_quotes
に結合させます。
複数の日付ディメンションを使用するには、(技術上の理由で) 特別の識別子と (視覚的な理由で) タイトルにより、区別する必要があります。
INCLUDE TEMPLATE "URN:GOODDATA:DATE" MODIFY (IDENTIFIER "born", TITLE "Born");
ALTER ATTRIBUTE {born.date} ADD KEYS {f_players.dt_born};
日付ディメンションを正しくファクトテーブルに結合するために、該当するデータで SYNCHRONIZE コマンドを呼び出します。
日付ディメンションの更新
会計年度のカレンダーを使用している場合、テンプレートの新バージョンが断続的にリリースされる可能性があります。 その場合、そのテンプレートから作成したプロジェクトですべての日付ディメンションを更新する必要があります。
UPDATE TEMPLATE "URN:FISCALAPR1:DATE" WITH DATA;
属性
属性は、データの集約 (またはスライス) 方法を特性する単位 (担当者、市町村、曜日、ID、グループなど) です。
属性には、任意で追加ラベルを含めることができます。 これらのラベルは、同じセマンティック値に関する別の文字列表現になります。 例えば、表示名が「J. Doe」、「Doe, John」、「Johnny」等だとしても、 「John Doe」と同一人物です。
属性の長さは、既定では 128 文字ですが、 最大で 10000 文字まで変更できます。 詳細については、属性ラベルの長さを変更するを参照してください。
CREATE ATTRIBUTE
CREATE ATTRIBUTE {attr.quotes.symbol} VISUAL(TITLE "Symbol", FOLDER {folder.quotes.attr}) AS {d_quotes_symbol.nm_symbol};
ALTER ATTRIBUTE
ALTER ATTRIBUTE {attr.quotes.symbol} ADD LABELS {attr.quotes.company} VISUAL(TITLE "Company") AS {d_quotes_symbol.nm_company};
DEFAULT LABEL
1つの属性に複数の追加ラベルを割り当てた場合、その中から既定の属性ラベルを指定できます。 複数のラベルを持つ属性を作成した場合、リストの最初のラベルが既定ラベルに割り当てられます。
既定ラベルを変更するには、Alter attribute 構文を使用します。
CREATE ATTRIBUTE {attr.quotes.attribute} AS LABELS {attr.quotes.label1} VISUAL(TITLE "Label 1"), {attr.quotes.label2};
ALTER ATTRIBUTE {attr.quotes.attribute} DEFAULT LABEL {attr.quotes.label2};
HYPERLINK LABEL
レポートにリンクを持つラベルを表示するには、そのラベルにハイパーリンクを追加します。
CREATE ATTRIBUTE {attr.quotes.attribute} AS LABELS {attr.quotes.label1} VISUAL(TITLE "Hyperlink") HYPERLINK;
ALTER ATTRIBUTE {attr.quotes.attribute} DEFAULT ALTER LABELS {attr.quotes.label1} HYPERLINK;
SORTING BY LABEL
ラベルことに属性をソートできます。 ラベルを作成して順序どおりに並べるには、順序 (ASC/DESC) を指定します。
CREATE ATTRIBUTE {attr.quotes.attribute} AS LABELS {attr.quotes.label1} VISUAL(TITLE "Label 1") ORDER {attr.quotes.label1} ASC;
ALTER ATTRIBUTE {attr.quotes.attribute} ORDER BY {attr.quotes.label1} DESC;
ファクト
CREATE FACT
CREATE FACT {fact.quotes.open_price} VISUAL( TITLE "Open Price", FOLDER {folder.quotes.fact})
AS {f_quotes.f_open_price};
ALTER FACT
ALTER FACT {fact.quotes.open_price} ADD {f_quotes2.f_open_price};
フォルダー
フォルダーは、レポート内のファクト/属性、メトリックを視覚的に整理するために使用します。 フォルターには、1つの種類のオブジェクトしか含まれないため、タイプとなります。
CREATE FOLDER
CREATE FOLDER {folder.quotes.attr} VISUAL ( TITLE "Stock Quotes Data", DESCRIPTION "Stock quotes data obtained from John Doe etc." )
TYPE ATTRIBUTE;
ALTER FOLDER
フォルダーは、属性、メトリック、ファクトの作成時や変更時に自動的にデータが読み込まれます。 フォルダーのオブジェクト名を変更するには:
ALTER FOLDER {folder.quotes.attr} VISUAL(TITLE "Quotes Attributes");
パフォーマンスの最適化
データモデルのパフォーマンスを最適化するには、次の手法を使います。
特定モデルのパフォーマンスを最適化するには、データモデリングの経験、特に GoodData でのモデリングの経験が必要です。 詳細については、GoodData カスタマーサポートにお問い合わせください。
DATATYPE を指定する
既定では、データマートは自動的にすべてのファクトを小数 (12,2) で保存し、すべての属性とラベルを 128 文字の長さの文字列で保存します。 パフォーマンス上の理由で、または他のデータタイプで保存したい場合は、列のデータタイプを再定義できます。
ALTER
DATATYPE {d_quotes_symbol.nm_symbol} VARCHAR(4),
{d_quotes_symbol.nm_symbol} VARCHAR(80), {f_quotes.f_open_price}
DECIMAL(10,2);
サポートされるデータタイプは、次のとおりです。
データタイプ | 形式 | 備考 |
---|---|---|
VARCHAR (N) | N (1..10000) | |
DECIMAL (M,D) | M min(-1e+20) max(1e+20), D max = 6. 許容最大値は M<=50 ですが、この数値はパフォーマンスに影響します。 D < M を常に維持します。 | |
INT | min(-2147483648) max(2147483647) | |
BIGINT | min(-1e+15) max(1e+15) | |
DATE | ‘YYYY-MM-DD’ | |
DOUBLE | 推奨しません |
以前からプロジェクトに DATE のデータタイプを含めていた場合、GoodData が提供する日付ディメンションに自動的にマッピングされます。
INCLUDE TEMPLATE "URN:GOODDATA:DATE" MODIFY (IDENTIFIER "my-date", TITLE "quote");
複数のファクト列を作成する
下の例では、ファクト fact.quotes.open_price
は既にファクト列 f_quotes.f_open_price
を持っていますが、パフォーマンス上の理由から、同じ列を f_quotes2
に追加できます。
ALTER FACT {fact.quotes.open_price} ADD {f_quotes2.f_open_price};