概要
LookML の絞り込みを使用すると、既存のビューまたは Explore を含む LookML ファイルを編集することなく、これらを調整することができます。次のような場合に最適です。
- 事前構築済みの LookML コンポーネントを使用する Looker Block を使用するプロジェクト
- 他のプロジェクトからファイルをインポートするプロジェクト
- データベースのテーブルからファイルを生成する必要があることが多いプロジェクト
- モデル間やプロジェクト間で LookML を共有しながら各々でカスタマイズを行う状況(ハブアンドスポーク構成)
たとえば、プロジェクトに次のビューファイルがあるとします。
view: flights {
sql_table_name: flightstats.accidents ;;
dimension: id {
label: "id"
primary_key: yes
type: number
sql: ${TABLE}.id ;;
}
}
次の例に示すように flights
ビューを絞り込むことができます。同じビュー名で view
パラメータを使用しますが、既存のビューの絞り込みであることを示すために、名前の前にプラス記号(+
)を追加します。
この絞り込みでは、既存の flights
ビューに air_carrier
ディメンションが追加されます。
view: +flights {
dimension: air_carrier {
type: string
sql: ${TABLE}.air_carrier ;;
}
}
この絞り込みは、モデルファイルやビューファイルなどのプロジェクトの任意の LookML ファイル内、または専用の LookML ファイル内に配置できます。その仕組みについては、LookML プロジェクトでの絞り込みの使用のセクションをご覧ください。
元の LookML と絞り込みを組み合わせると、最終的な結果はビューの元の LookML と同様になります。
view: flights {
sql_table_name: flightstats.accidents ;;
dimension: id {
label: "id"
primary_key: yes
type: number
sql: ${TABLE}.id ;;
}
dimension: air_carrier {
type: string
sql: ${TABLE}.air_carrier ;;
}
}
Looker UI では、元のビューファイルにディメンションを追加した場合と同様に、[航空会社] ディメンションが表示されます。
詳細な実装情報については、例のセクションをご覧ください。
絞り込みと拡張の比較
Looker は、拡張 LookML オブジェクトもサポートしています。拡張は、既存のビューまたは Explore の新しく作成したコピーに新しいオブジェクトを追加する場合に便利です。たとえば、すべてのフィールドを定義するベースビューを作成し、その後、そのベースビューを拡張する複数の新しいビューを作成できます。新しいビューは、ベースビューで特定のフィールドを非表示にする、またはベースビューからフィールドの定義やラベルを変更するように変更できます。
絞り込みは、既存のビューや Explore を、特定のオブジェクトに対する微調整や調整で変更したいが、ビューや Explore のコピーを作成したくない場合に便利です。絞り込みは、ベースビューや Explore を変更できない、または変更したくない場合や、新しいビューや Explore を作成するときに他の LookML 参照に大幅な変更が必要な場合に適しています。このユースケースの例については、このページの例のセクションをご覧ください。
ほとんどのユースケースでは、絞り込みは extends
よりもシンプルでクリーンな代替手段です。
高度な LookML デベロッパーは、LookML の絞り込み内で extends
パラメータを使用できます。詳しくは、このページの絞り込みには拡張を含めることができるのセクションをご覧ください。
絞り込みはほとんどのパラメータをオーバーライドする
ほとんどの場合、絞り込みはオブジェクトの元の設定をオーバーライドすることに注意してください。次の例では、元のビューに非表示のディメンション(hidden: yes
)があります。
view: faa_flights {
dimension: carrier {
hidden: yes
}
}
また、別のファイルでは、hidden: no
を使用してディメンションが絞り込まれています。
include: "/views/faa_flights.view.lkml"
view: +faa_flights {
dimension: carrier {
hidden: no
}
}
最後の絞り込みが優先されるため、hidden: no
が適用され、ディメンションが最終的なビューに表示されます。
場合によっては、オーバーライドではなく追加的な絞り込みを行うこともできます。詳しくは、このページの一部のパラメータは追加型のセクションをご覧ください。
一部のパラメータは追加型
絞り込み対象オブジェクトと同じパラメータが絞り込みに含まれる場合、その絞り込みによって絞り込みオブジェクトのパラメータ値が上書きされます。
ただし、絞り込みでは、一部のパラメータを絞り込みを追加型にすることが可能で、ベース オブジェクトの値が、絞り込みオブジェクトの値と組み合わせて使用されます。
以下のパラメータは追加型です。
ディメンションとメジャーの場合:
パラメータの場合:
派生テーブルの場合:
ビューの場合:
extends
(詳細については、このページの絞り込みextends
は追加型のセクションをご覧ください)。
Explore の場合:
access_filter
aggregate_table
extends
(詳細については、このページの絞り込みextends
は追加型のセクションをご覧ください)。join
query
たとえば、link
パラメータの name
ディメンションを含むビューは次のようになります。
view: carriers {
sql_table_name: flightstats.carriers ;;
dimension: name {
sql: ${TABLE}.name ;;
type: string
link: {
label: "Google {{ value }}"
url: "http://www.google.com/search?q={{ value }}"
icon_url: "http://google.com/favicon.ico"
}
}
}
また、link
パラメータの値が異なる name
ディメンションを使用した carriers
ビューの絞り込みは以下のとおりになります。
include: "/views/carriers.view.lkml"
view: +carriers {
label: "Refined carriers"
dimension: name {
sql: ${TABLE}.name ;;
type: string
link: {
label: "Dashboard for {{ value }}"
url: "https://docsexamples.dev.looker.com/dashboards/307?Carrier={{ value }}"
icon_url: "https://www.looker.com/favicon.ico"
}
}
}
絞り込みされた carriers
ビューでは、2 つの link
パラメータは追加型であるため、name
ディメンションには両方のリンクが表示されます。
絞り込みが順番に適用される
オブジェクトを複数の場所で複数回絞り込みすることが可能で、これにより Looker デベロッパーはさまざまなクリエイティブな方法で絞り込みを使用できます。ただしこれは、以下のように、デベロッパーが絞り込みが適用される順序に留意する必要があることも意味します。
- プロジェクト内では、ファイルが含まれる順序で絞り込みが適用されます。最後に含まれたファイルによる絞り込みは、それ以前に含まれたファイルによる絞り込みよりも優先されます。
- 1 つのファイル内では、下方向に行単位で絞り込みが適用されます。行番号が最大の絞り込みは最後に適用され、競合がある場合は以前の絞り込みより優先されます。
たとえば、次のビューファイルには、faa_flights
ビューの 2 つの絞り込みが含まれています。最初の絞り込みではディメンション(hidden: yes
)が非表示になり、2 つ目の絞り込みではディメンション(hidden: no
)が表示されます。このような競合が発生すると、ファイル内の一番最後の絞り込みが優先されます。
include: "//e_faa_original/views/faa_flights.view.lkml"
view: +faa_flights {
dimension: carrier {
hidden: yes
}
}
view: +faa_flights {
dimension: carrier {
hidden: no
}
}
このロジックは、プロジェクトに複数のファイルを含める場合も同様です。インクルードにリストされている最後のファイルの絞り込みが優先されます。たとえば、モデルファイルにこれらのファイルが含まれている場合:
include: "/refinements/distance_analysis.lkml"
include: "/refinements/finishing_touches.lkml"
distance_analysis.lkml
の絞り込みが最初に適用されてから、finishing_touches.lkml
ファイルの絞り込みが適用されます。競合が存在する場合は、最後のファイル finishing_touches.lkml
の絞り込みが優先されます。
final: yes
を使用したさらなる絞り込みの回避
前述のように、同じオブジェクトを複数の場所で複数回絞り込むことができ、最後の絞り込みが、以前のすべての絞り込みをオーバーライドします。
特定の絞り込みをビューや Explore の最終の絞り込みと見なす場合は、final: yes
フラグを絞り込みに追加します。この最終の絞り込みの後に適用される既存の絞り込みがある場合、またはデベロッパーがこの最終の絞り込みの後に適用される新しい絞り込みを追加しようとすると、Looker IDE は LookML エラーを返します。たとえば、このビューファイルで 2 番目の絞り込みを行うと、前の絞り込みには final: yes
フラグがあるため、LookML エラーが表示されます。
include: "//e_faa_original/views/faa_flights.view.lkml"
view: +faa_flights {
final: yes
dimension: carrier {
hidden: yes
}
}
view: +faa_flights {
dimension: carrier {
hidden: no
}
}
絞り込みに final: yes
フラグを追加すると、絞り込みが意図した順序で適用されていることを確認できます。
絞り込みには拡張を含めることができる
高度な LookML のデベロッパーは、LookML の絞り込み内で extends
パラメータを使用できます。このパラメータは、拡張されたオブジェクトを調絞り込み対象のオブジェクトに追加します。
extends
と絞り込みの動作をまとめると、以下のようになります。
- オブジェクトを拡張すると、オブジェクトの新しいコピーが作成され、その上に構築されます。たとえば、すべてのフィールドを定義するベースビューを作成し、その後、そのベースビューを拡張する複数の新しいビューを作成できます。新しいビューにはそれぞれベースビューのコピーが組み込まれ、デベロッパーはそこからさまざまなフィールド、フィルタ、その他のプロパティを追加してベースビューの内容を変更できます。これは、ベース オブジェクトから始めて、それを他の複数のオブジェクトでさまざまな方法で使用するという考え方です。(拡張の操作の詳細については、拡張機能でのコードの再利用ドキュメント ページをご覧ください)。
- オブジェクトを絞り込むと、オブジェクトに変更レイヤが追加されますが、拡張とは異なり、オブジェクトのコピーは作成されません。これは、元の LookML を変更せずにベース オブジェクト上に構築するという考え方です。
絞り込みの標準的な使用例として、orders
という Explore と、それを絞り込む +orders
Explore を次に示します。
explore: orders {
view_name: orders
# other Explore parameters
}
explore: +orders {
label: "Orders Information"
# other Explore parameters to build on the original Explore
}
さらに、extends
を含む絞り込みを追加することもできます。この例に基づいた同じ orders
Explore を以下に示します。さらに、users_base
という名前のベース Explore があります。また、+orders
絞り込みには、users_base
を取り込む extends
パラメータがあります。
explore: users_base {
view_name: users
extension: required
# other Explore parameters
}
explore: orders {
view_name: orders
# other Explore parameters
}
explore: +orders {
label: "Orders Information"
extends: [users_base]
# other Explore parameters to build on the original Explore
}
ここで特別なのは、+orders
の絞り込みに extends
が含まれていることです。結果として、+orders
ビューにより users_base
Explore が拡張されるようになりました。
Looker が絞り込み内で extends
を実装する方法
絞り込み内のオブジェクトの拡張は、高度な LookML のコンセプトです。絞り込みで extends
を使用する前に、次のことを十分に理解しておく必要があります。
- Looker での
extends
の実装方法: LookML 要素が、拡張されたオブジェクトと拡張するオブジェクトの両方で定義されている場合、パラメータが 追加的でない限り、拡張るオブジェクト内のバージョンが使用されます。詳しくは、拡張機能でのコードの再利用のドキュメントのページをご覧ください。 - Looker での絞り込みの実装方法: LookML 要素が複数の絞り込みで定義されている場合、最後の絞り込みが以前の絞り込みよりも優先されます。詳細については、このページの絞り込みが順番に適用されるをご覧ください。
最後に、絞り込みで使用する extends
を実装するために Looker でこれらの原則を組み合わせる方法を理解する必要があります。Looker が実装する順序を以下に示します。競合が発生した場合は、各ステップが以前のものをオーバーライドします。
- オブジェクトで指定された
extends
の値 - オブジェクトの絞り込みで指定された
extends
の値 - オブジェクトからの値
- オブジェクトの絞り込みの値
以下に、実装の各ステップで label
パラメータの値を追跡する例を示します。
explore: orders_base {
label: "Orders Base"
view_name: orders
extension: required
}
explore: users_base {
label: "Users Base"
view_name: users
extension: required
}
explore: orders {
label: "Orders"
extends: [orders_base]
}
explore: +orders {
label: "Orders Refined"
extends: [users_base]
}
Looker で、この例の orders
Explore の label
値を実装しています。
- オブジェクトで指定された
extends
の値。orders
Explore にはextends
パラメータがあるため、Looker は拡張対象のオブジェクト(この場合はorders_base
Explore)の LookML 要素から始めます。この時点で、label
の値は「Orders Base」です。 - オブジェクトの絞り込みで指定された
extends
の値orders
には絞り込みがあり、絞り込みにはextends
パラメータがあるため、Looker は絞り込みの拡張機能(この場合はusers_base
Explore)の LookML 要素を適用します。この時点で、label
の値は「Users Base」です。 - オブジェクトからの値。すべての拡張機能が処理されたので、Looker は拡張オブジェクトの要素を適用します(この場合は
orders
Explore)。競合がある場合は、拡張オブジェクトが優先されます。これで、label
値は「Orders」になります。 - オブジェクトの絞り込みの値。最後に、Looker は
orders
Explore の絞り込みの要素を適用します。競合がある場合は、絞り込みオブジェクトが優先されます。これで、label
値は「Orders Refined」になります。
絞り込み extends
は加算型である
このページの絞り込みはパラメータをオーバーライドするのセクションで説明したように、通常、絞り込みはオブジェクトの元の設定をオーバーライドします。extends
パラメータは、これに該当しません。絞り込みで extends
を使用すると、extends
パラメータの値は、元のオブジェクトまたは以前の絞り込みで拡張された項目のリストに追加されます(該当する場合)。競合が存在する場合、拡張機能のチェーン内の最後の項目が優先されます。
例として、orders_base
というベース Explore と、ベースを拡張する orders
Explore を次に示します。また、users_base
Explore と、users_base
を拡張する +orders
絞り込みがあります。
explore: orders_base {
view_name: orders
extension: required
# other Explore parameters
}
explore: users_base {
view_name: users
extension: required
# other Explore parameters
}
explore: orders {
extends: [orders_base]
# other Explore parameters to build on the base Explore
}
explore: +orders {
extends: [users_base]
# other Explore parameters to build on the base Explores
}
orders
Explore が orders_base
を拡張し、+orders
絞り込みで users_base
が extends
リストに追加されます。結果として、+orders
の Explore では、Explore の元の LookML と同じように、orders_base
と users_base
の両方が拡張されます。
explore: orders {
extends: [orders_base, users_base]
}
競合が存在する場合、拡張機能のチェーン内の最後の項目が優先されます。この例では、users_base
内の要素は、orders_base
内の競合する要素をオーバーライドします。
一度に複数のオブジェクトを拡張するコンセプトについては、拡張機能でのコードの再利用のドキュメントのページをご覧ください。
最後の注意事項として、この例では explore
パラメータの順序に意味はありません。ただし、同じオブジェクトの複数の絞り込みを行う場合は、絞り込みの順序が重要になります。前述の絞り込みが順番に適用されるセクションで説明したように、ファイルの最後の絞り込みが以前の絞り込みよりも優先されます。
LookML プロジェクトでの絞り込みの使用
プロジェクト内のビューと Explore を絞り込むための大まかな手順は次のとおりです。
- 絞り込むビューまたは Explore を特定します。
- 絞り込みを格納する場所を決定します。既存の LookML ファイルに絞り込みを追加することも、絞り込み用に別の LookML ファイルを作成することもできます。(一般的な LookML ファイルの作成例については、他のプロジェクト ファイルについてのドキュメント ページでデータテスト ファイルの作成手順をご覧ください。)
include
パラメータを使用して、絞り込みをモデルに組み込みます。- 絞り込みを記述するファイルに、絞り込む LookML のファイルを含める必要があります。含まれていないオブジェクトを絞り込むと、Looker IDE から警告が表示されます。
- モデルファイルに、絞り込みが定義されているファイルを含めます。ファイルを組み合わせてインクルードをクリエイティブな方法で使用できます。詳細については、このページの絞り込みを使用してモデルにレイヤを追加するをご覧ください。
例
LookML オブジェクトを絞り込むと、元の LookML を編集しなくても、簡単にビューと Explore を調整しりことができます。これは、プロジェクトでビューと Explore が読み取り専用になっている場合(他のプロジェクトからインポートされたファイルなどについて)に特に便利です。Explore の絞り込みの例を次に示します。
aircraft
Explore の LookML は次のとおりです。
explore: aircraft {
join: aircraft_types {
type: left_outer
sql_on: ${aircraft.id} = ${aircraft_types.id} ;;
relationship: many_to_one
}
join: aircraft_engine_types {
type: left_outer
sql_on: ${aircraft.id} = ${aircraft_engine_types.id} ;;
relationship: many_to_one
}
}
この Explore には複数のビューがあり、各ビューに多数のディメンションがあります。
e_faa_refined
という別の LookML プロジェクトが aircraft
Explore ファイルをインポートします。e_faa_refined
プロジェクトで、aircraft
Explore を大幅に簡素化するために絞り込みを使用できます。
aircraft
Explore はインポートされたファイルであるため、直接編集することはできません。代わりに、絞り込みを追加することができます。この LookML を含む refinements.lkml
という別のファイルの例を次に示します。
include: "//e_faa_original/Explores/aircraft.explore.lkml"
explore: +aircraft {
label: "Aircraft Simplified"
fields: [aircraft.aircraft_serial, aircraft.name, aircraft.count]
}
refinements.lkml
ファイルには次のものが含まれます。
- インポートしたプロジェクトから元の
aircraft.explore.lkml
ファイルを追加するinclude
パラメータ(インポートされたプロジェクト ファイルを参照する方法の詳細については、他のプロジェクトからのファイルのインポートのドキュメント ページをご覧ください)。 aircraft
Explore の絞り込み:
最終的な結果は、元の aircraft
Explore と aircraft
ビューと同様になります。
explore: aircraft {
label: "Aircraft Simplified"
}
view: aircraft {
sql_table_name: flightstats.aircraft ;;
dimension: aircraft_serial {
type: string
sql: ${TABLE}.aircraft_serial ;;
}
dimension: name {
type: string
sql: ${TABLE}.name ;;
}
measure: count {
type: count
}
}
絞り込みを使用して複数のユースケース用に単一のビューをカスタマイズする例については、DRY LookML でのコードの再利用性の最大化: 複数のユースケースに合わせて単一のベースビューをカスタマイズするのクックブック レシピをご覧ください。
絞り込みのその他のユースケース
前述のとおり、絞り込みは、Looker Block やインポートされたファイルなど、読み取り専用の LookML オブジェクトを調整する場合に最適です。
ただし、絞り込みを追加し、モデルに絞り込みを入れようと思い立ったら、次の例のように、プロジェクトで優れた作業を行うことができます。
絞り込みを使用して分析を追加する
絞り込みを使用すると、元の LookML ファイルにアクセスすることなく、モデルに分析を追加できます。たとえば、ビューと Explore がデータベース内のテーブルから生成され、faa_basic.lkml
という LookML ファイルに保存されるプロジェクトが存在する場合は、絞り込みを使用して分析を追加する faa_analysis.lkml
ファイルを作成できます。距離分析を含む distance_stats
という新しい派生テーブルの例を次に示します。この例では、distance_stats
派生テーブルを flights
Explore に結合する faa_basic.lkml
ファイルから、既存の flights
Explore を絞り込む例を示しています。また、この例の一番下では、既存の flights
ビューが絞り込まれ、分析から新しいフィールドが追加されています。
include: "faa_basic.lkml"
explore: +flights {
join: distance_stats {
relationship: one_to_one
type: cross
}
}
view: distance_stats {
derived_table: {
explore_source: flights {
bind_all_filters: yes
column: distance_avg {field:flights.distance_avg}
column: distance_stddev {field:flights.distance_stddev}
}
}
dimension: avg {
type:number
sql: CAST(${TABLE}.distance_avg as INT64) ;;
}
dimension: stddev {
type:number
sql: CAST(${TABLE}.distance_stddev as INT64) ;;
}
}
view: +flights {
measure: distance_avg {
type: average
sql: ${distance} ;;
}
measure: distance_stddev {
type: number
sql: STDDEV(${distance}) ;;
}
dimension: distance_tiered2 {
type: tier
sql: ${distance} ;;
tiers: [500,1300]
}
}
絞り込みを使用してモデルにレイヤを追加する
絞り込みのもう 1 つの興味深いユースケースは、プロジェクトにレイヤを追加することです。複数の絞り込みファイルを作成して、戦略的に含めることで、レイヤを追加できます。
たとえば、FAA プロジェクトには、データベース内のテーブルから生成されたすべてのビューと Explore を含む faa_raw.lkml
ファイルがあります。このファイルにはデータベース内のすべてのテーブルのビューがあり、各テーブルには各データベース列のディメンションがあります。
未加工のファイルに加えて、faa_basic.lkml
ファイルを作成して、Explore への結合の追加やビューへのメジャーの追加など、基本的な絞り込みを行うための新しいレイヤを追加できます。次に例を示します。
include: "faa_raw.lkml"
explore: +flights {
join: carriers {
sql_on: ${flights.carrier} = ${carriers.name} ;;
}
}
view: +flights {
measure: total_seats {
type: sum
sql: ${aircraft_models.seats} ;;
}
}
次に、faa_analysis.layer.lkml
ファイルを追加して分析付きの新しいレイヤを追加できます(分析ファイルの例については、絞り込みを使用して分析を追加するのサブセクションをご覧ください)。
そこから必要な作業は、すべての絞り込みファイルをモデルファイルに含めるだけです。モデルファイルを使用して、参照するデータベース テーブルでビューを指すように絞り込みを追加することもできます。
connection: "publicdata_standard_sql"
include: "faa_raw.lkml"
include: "faa_basic.lkml"
include: "faa_analysis.lkml"
view: +flights {
sql_table_name: lookerdata.faa.flights;;
}
view: +airports {
sql_table_name: lookerdata.faa.airports;;
}
view: +aircraft {
sql_table_name: lookerdata.faa.aircraft;;
}
view: +aircraft_models{
sql_table_name: lookerdata.faa.aircraft_models;;
}
view: +carriers {
sql_table_name: lookerdata.faa.carriers;;
}
このモデルファイルを複製して別のデータベース テーブルを指すことも、モデルで必要な他のレイヤを定義するために作成したさまざまな絞り込みファイルを含めることもできます。
PDT の絞り込みの使用
このページの絞り込みと拡張の比較セクションで説明したように、拡張では拡張対象オブジェクトの新しいコピーが作成されます。永続的な派生テーブル(PDT)の場合は、PDT のそれぞれの拡張によってデータベースにテーブルの新しいコピーが作成されるため、拡張を使用しないでください。
ただし、絞り込みでは絞り込み対象のオブジェクトの新しいコピーが作成されないため、PDT のビューに絞り込みを追加できます。
メタデータを使用したオブジェクトの絞り込みの表示
Looker IDE で explore
パラメータや view
パラメータをクリックすると、メタデータ パネルを使ってオブジェクトの絞り込みを確認できます。詳細については、LookML オブジェクトのメタデータのドキュメント ページをご覧ください。
注意点
ローカライズのあるプロジェクト
オブジェクトを絞り込む場合は、絞り込みにもローカライズ ルールが適用されることに注意してください。オブジェクトを絞り込んで新しいラベルや説明を定義する場合は、プロジェクトのロケール文字列ファイルにローカライズ定義を指定する必要があります。詳細については、LookML モデルのローカライズのドキュメント ページをご覧ください。