これは、読者が LookML に関する確かな知識を持っていることを前提としています。
概要
LookML の絞り込みを使用すると、LookML ファイルを含む LookML ファイルを編集することなく、既存のビューまたはデータ探索を調整できます。これは次のような場合に適しています。
- 事前構築された LookML を使用する Looker Blocks を含むプロジェクト
- 他のプロジェクトからファイルをインポートするプロジェクト
- データベース内のテーブルからファイルを生成する必要があることが多いプロジェクト
- モデルまたはプロジェクト間で 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 では、元のビューファイル自体にディメンションを追加した場合と同様に、[Air Carrier] ディメンションが表示されます。
実装について詳しくは、以下の例をご覧ください。
期間延長による絞り込み
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
たとえば、name
ディメンションと link
パラメータを含むビューは次のようになります。
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"
}
}
}
ここでは、carriers
ビューを絞り込んで、name
ディメンションの link
パラメータの値を変えています。
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
ディメンションには両方のリンクがあります。Explore でのディメンションは次のようになります。
絞り込みが順番に適用されます
オブジェクトは、複数回にわたって複数の場所で改良できます。これにより、Looker デベロッパーはさまざまな工夫を凝らして使用することができます。ただし、デベロッパーは絞り込みの適用順序に注意しなければなりません。
- プロジェクト内では、絞り込みはファイルが含まれる順序で適用されます。前回インクルードしたファイルからの絞り込みは、先にインクルードしたファイルの絞り込みをオーバーライドします。
- 1 つのファイル内で、絞り込みを行単位で行います。行番号が最も高い絞り込みが最後に適用され、競合がある場合は以前の絞り込みがオーバーライドされます。
final: yes
フラグを使用すると、絞り込みが期待どおりに適用されていることを確認できます。詳しくは、final: yes
を使用してこれ以上絞り込むことができないをご覧ください。
たとえば、次のビューファイルでは 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
)の絞り込みが優先されます。
絞り込みではインクルードの順序が利用されるため、絞り込みを使用する場合は、インクルードでワイルドカードを使用しないでください。一般に、ビューにワイルドカードを使用することは避けることをおすすめします。特にプロジェクトに大量のビューファイルがある場合や、プロジェクトで永続的な派生テーブル(PDT)を使用している場合は、このベスト プラクティスをおすすめします。ただし、絞り込みでは、インクルードでワイルドカードを使用することはおすすめしません。
final: yes
でこれ以上絞り込むことができない
前述のとおり、同じオブジェクトを複数の場所で複数回絞り込むことができます。最後の絞り込みは、それ以前の絞り込みをすべてオーバーライドします。
絞り込みをビューや Explore の最終絞り込みと見なす場合は、final: yes
フラグを絞り込みに追加します。この最終絞り込みの後に適用される調整がすでにある場合、またはデベロッパーがこの絞り込みの後に適用する新しい絞り込みを追加しようとすると、Looker IDE は LookML エラーを返します。たとえば、このビューファイルの 2 つ目の絞り込みには、LookML エラーが発生します。前の絞り込みには final: yes
フラグがあるためです。
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 要素が複数の絞り込みで定義されている場合、最後の絞り込みは以前の絞り込みをオーバーライドします。詳しくは、このページの絞り込みが順番に適用されるをご覧ください。
最後に、Looker がこれらの原則を組み合わせて、絞り込みで使用する extends
を実装する方法を理解しました。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]
}
この例の orders
Explore で、Looker は label
の値を実装します。
- オブジェクトで指定された
extends
の値。orders
Explore にはextends
パラメータがあるため、Looker は拡張されているオブジェクト(この場合はorders_base
)の 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 の「注文の絞り込み」となります。
絞り込み 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
}
}
絞り込みのその他のユースケース
前述のように、絞り込みは、Looker Blocks やインポートされたファイルなど、読み取り専用の 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]
}
}
絞り込みを使用してモデルにレイヤを追加する
絞り込みのもう一つの興味深いユースケースは、プロジェクトにレイヤを追加することです。複数の絞り込みファイルを作成して、戦略的に組み込んでレイヤを追加できます。
たとえば、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 モデルのローカライズのドキュメントをご覧ください。