LookML 精修

總覽

透過 LookML 修飾,您可以調整現有的檢視區塊探索,不必編輯包含這些項目的 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,最終結果會像是檢視的原始 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 使用者介面中,使用者會看到「航空公司」維度,就像您已將該維度新增至原始檢視檔案一樣。

如需更詳細的實作資訊,請參閱「範例」一節。

與擴展功能相比,改善功能

Looker 也支援擴充 LookML 物件。如果您想建立現有資料檢視或探索的新副本,並在其中新增物件,就可以使用擴充功能。舉例來說,您可以建立定義所有欄位的基本檢視畫面,然後建立多個擴充基本檢視畫面的新檢視畫面。接著,您可以修改這些新檢視畫面,隱藏基本檢視畫面中的特定欄位,或是變更基本檢視畫面中欄位的定義或標籤。

如果您想對現有檢視畫面或探索進行微調或調整特定物件,但不想建立檢視畫面或探索的副本,就可以使用精修功能。如果您無法或不想修改基礎資料檢視或探索,或是建立新資料檢視或探索會大幅變更其他 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,並在最終檢視畫面中顯示維度。

在某些情況下,精細調整是加成而非覆寫;詳情請參閱本頁的「部分參數為加成」一節。

部分參數為加法

在許多情況下,如果精修項目包含與精修物件相同的參數,精修項目會覆寫精修物件的參數值

但部分參數的精細調整可以是加成,也就是說,系統會一併使用基本物件和精細調整物件的值。

下列參數為加法

舉例來說,以下是具有 link 維度和 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"
    }
  }
}

以下是 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 檢視畫面中,這兩個 link 參數會相加,因此 name 維度會顯示這兩個連結。

系統會依序套用分類標籤

物件可多次在多個位置進行精修,因此 Looker 開發人員可以透過許多創意方式使用精修項目。但這也表示開發人員必須非常注意套用精細化項目的順序:

  • 在專案中,系統會按照檔案的納入順序套用修正內容。最後加入的檔案會覆寫先前加入檔案的修正內容。
  • 在單一檔案中,系統會逐行套用精修內容,從上到下。行號最高的精細化項目會最後套用,如有衝突,將覆寫先前的精細化項目。

舉例來說,在下列檢視區塊檔案中,有兩個 faa_flights 檢視區塊的精修項目。第一個精細化項目會隱藏維度 (hidden: yes),第二個精細化項目則會顯示維度 (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
  }
}

在專案中加入多個檔案的邏輯也類似:以 includes 中列出的最後一個檔案為準。舉例來說,如果模型檔案包含下列檔案:

include: "/refinements/distance_analysis.lkml"
include: "/refinements/finishing_touches.lkml"

系統會先套用 distance_analysis.lkml 中的任何修正,然後套用 finishing_touches.lkml 檔案中的任何修正。如有任何衝突,系統會優先採用最後一個檔案 (finishing_touches.lkml) 中的修正內容。

使用 final: yes 避免進一步修正

如先前所述,您可以在多個位置多次調整同一物件,而最後一次調整覆寫所有先前的調整。

如果希望將某項精修視為檢視區塊或「探索」的最終精修,可以將 final: yes 旗標新增至該精修。如果現有精細化項目會在最終精細化項目後套用,或是開發人員嘗試新增精細化項目,且該項目會在最終精細化項目後套用,Looker IDE 就會傳回 LookML 錯誤。舉例來說,這個檢視區塊檔案中的第二個精簡項目會產生 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 和精細調整的行為摘要:

  • 擴充物件時,系統會建立物件的新副本,然後以該副本為基礎進行建構。舉例來說,您可以建立定義所有欄位的基本檢視畫面,然後建立多個擴充基本檢視畫面的新檢視畫面。這些新檢視畫面都會納入基本檢視畫面的副本,開發人員可從中新增不同欄位、篩選器或其他屬性,藉此修改基本檢視畫面中的內容。概念是從基本物件開始,然後在多個其他物件中以不同方式使用。(如要完整瞭解如何使用 extends,請參閱「使用 extends 重複使用程式碼」說明文件頁面)。
  • 精修物件會為物件新增一層修改內容,但與擴充不同的是,精修不會製作物件的多個副本。這個概念是建構基本物件,但不修改原始 LookML。

以下是精細化標準用法的範例,其中 orders 是原始探索,+orders 則是經過精細化的探索:

explore: orders {
  view_name: orders
  # other Explore parameters
}

explore: +orders {
  label: "Orders Information"
  # other Explore parameters to build on the original Explore
}

此外,你也可以新增包含 extends 的精確條件。以這個範例為基礎,以下是相同的 orders 探索。但此外,還有一個名為 users_base 的基礎探索,現在 +orders 修正項目具有 extends 參數,可帶入 users_base


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

Looker 如何在精細化調整中實作 extends

在精細化項目中擴充物件是進階的 LookML 概念。在精修時使用 extends 前,請務必深入瞭解下列事項:

  • Looker 實作 extends 的方式:如果 LookML 元素同時定義在「擴充」物件和「擴充中」物件中,系統會使用擴充中物件的版本,除非參數是「加法」詳情請參閱「使用 extends 重複使用程式碼」說明文件頁面。
  • Looker 實作精細化項目的方式:如果多個精細化項目中定義了 LookML 元素,則最後一個精細化項目會覆寫先前的精細化項目。詳情請參閱本頁的「依序套用精選條件」一節。

最後,您應瞭解 Looker 如何結合這些原則,實作用於精修的 extends。以下是 Looker 的實作順序,如果發生衝突,每個步驟都會覆寫前一個步驟:

  1. 物件中指定的 extends
  2. 物件精細化設定中指定的 extends
  3. 物件中的值
  4. 物件的精選項目值

為說明這點,以下範例會追蹤 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 探索功能導入 label 的值:

  1. 物件中指定的 extends 值。由於 orders 探索具有 extends 參數,因此 Looker 會從要擴充的物件 (在本例中為 orders_base 探索) 開始使用 LookML 元素。此時 label 的值為「Orders Base」。
  2. 物件精細化設定中指定的 extends 值。由於 orders 有精簡項目,且精簡項目有 extends 參數,因此 Looker 會套用精簡項目擴充功能的 LookML 元素,在本例中為 users_base 探索。此時 label 的值為「Users Base」。
  3. 物件中的值。所有擴充功能都已處理完畢,Looker 會套用擴充物件中的元素,在本例中為 orders「探索」。如有任何衝突,則以擴充物件為準。因此,label 值現在是「Orders」。
  4. 物件精細化的值。最後,Looker 會套用orders探索的任何修正項目中的元素。如有任何衝突,則以精修物件為準。因此,label 值現在是「Orders Refined」。

修正 extends 是以附加方式套用

如本頁「精細調整會覆寫參數」一節所述,精細調整通常會覆寫物件的原始設定。但 extends 參數並非如此。在精細化作業中使用 extends 時,extends 參數中的值會附加至原始物件或先前精細化作業中擴充的項目清單 (如有)。接著,如有任何衝突,系統會優先處理擴充鏈中的最後一個項目。

舉例來說,以下是名為 orders_base 的基礎探索,以及擴充基礎探索的 orders 探索。此外,還有「探索」users_base和「修正」+orders功能,可擴充「探索」users_base功能:

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 探索會擴充 orders_base,然後 +orders 修正會將 users_base 新增至 extends 清單。結果是 +orders Explore 現在會同時擴充 orders_baseusers_base,就像這是 Explore 的原始 LookML 一樣:

explore: orders {
  extends: [orders_base, users_base]
}

接著,如有任何衝突,系統會優先處理擴充鏈中的最後一個項目。在本例中,users_base 中的元素會覆寫 orders_base 中任何衝突的元素。

如要瞭解一次擴充多個物件的概念,請參閱「使用 extends 重複使用程式碼」說明頁面。

最後,請注意,在本範例中,explore 參數的順序並不重要。但如果對同一物件進行多次精修,精修順序就很重要。如本頁「依序套用修正」一節所述,檔案中的最後一項修正會覆寫先前的修正。

在 LookML 專案中使用精細化

以下是專案中精簡檢視區塊和探索的步驟:

  1. 找出要調整的檢視畫面或探索。
  2. 決定要將精修項目放在哪個位置。您可以在任何現有的 LookML 檔案中新增精細化項目,也可以為精細化項目建立個別的 LookML 檔案。(如需建立一般 LookML 檔案的範例,請參閱「瞭解其他專案檔案」說明文件頁面上的建立資料測試檔案程序)。
  3. 使用 include 參數將修正內容併入模型:
    • 在撰寫精修內容的檔案中,您必須納入要精修的 LookML 檔案。如果您嘗試修正未納入的物件,Looker IDE 會顯示警告。
    • 在模型檔案中,加入定義精修項目的檔案。您可以合併檔案,並以極具創意的方式使用 include;詳情請參閱本頁的「使用精修功能為模型新增圖層」一節。

範例

只要調整 LookML 物件,就能輕鬆調整檢視區塊和 Explore,不必編輯原始 LookML。如果專案中的檢視畫面和探索是唯讀狀態 (例如從其他專案匯入的檔案),這項功能就特別實用。以下是精確搜尋探索結果的範例。

以下是 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
  }
}

這項探索包含多個檢視畫面,每個畫面都有許多維度。

現在,另一個名為 e_faa_refined 的 LookML 專案會匯入 aircraft「探索」檔案。在 e_faa_refined 專案中,您可以使用精簡功能大幅簡化 aircraft 探索。

由於「aircraft 探索」是匯入的檔案,因此無法直接編輯。不過,你可以新增精選內容。以下是名為 refinements.lkml 的獨立檔案範例,其中包含下列 LookML:

include: "//e_faa_original/Explores/aircraft.explore.lkml"

explore: +aircraft {
  label: "Aircraft Simplified"
  fields: [aircraft.aircraft_serial, aircraft.name, aircraft.count]
}

refinements.lkml 檔案包含下列項目:

  • include 參數,可從匯入的專案中帶入原始 aircraft.explore.lkml 檔案 (如要瞭解如何參照匯入的專案檔案,請參閱「從其他專案匯入檔案」說明文件頁面)。
  • aircraft「探索」的修正項目:
    • 「探索」名稱前方的 + 符號表示現有探索的精簡版。
    • label 參數會將「探索」的標籤變更為「Aircraft Simplified」。
    • fields 參數指定「探索」中只會顯示三個欄位。

最終結果會如同原始的「探索」和「檢視」aircraftaircraft

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 盡量重複使用程式碼:為多個用途自訂單一基礎檢視區塊」教戰手冊食譜。

其他精選內容用途

如前所述,修飾項非常適合用來調整唯讀的 LookML 物件,例如 Looker Blocks匯入的檔案

不過,一旦熟悉如何新增和納入模型中的精修項目,就能在專案中做出非常酷炫的成果,如下列範例所述。

使用精簡功能新增分析

您可以使用精細化項目,在模型中新增分析,不必修改原始 LookML 檔案。舉例來說,如果專案中的檢視區塊和探索是從資料庫中的資料表產生,並儲存在名為 faa_basic.lkml 的 LookML 檔案中,您可以建立 faa_analysis.lkml 檔案,並使用精細化項目新增分析。以下是名為 distance_stats 的新衍生資料表範例,其中包含距離分析。這個範例顯示現有 flights 探索的修正內容,該探索來自 faa_basic.lkml 檔案,會將 distance_stats 衍生資料表併入 flights 探索。此外,在範例底部,現有的 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 專案中,有一個 faa_raw.lkml 檔案包含從資料庫中的資料表產生的所有檢視區塊和探索。這個檔案包含資料庫中每個資料表的檢視畫面,每個檢視畫面都有對應的資料庫資料欄維度。

除了原始檔案,您也可以建立 faa_basic.lkml 檔案,新增具有基本精修功能的新層,例如將聯結新增至探索,或將指標新增至檢視畫面,如下所示:

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 中點選 exploreview 參數,並使用中繼資料面板查看物件的任何修正。詳情請參閱「LookML 物件的中繼資料」說明文件頁面。

注意事項

已完成本地化的專案

微調物件時,請注意本地化規則也適用於微調項目。如果您要修正物件,然後定義新的標籤或說明,請在專案的語言代碼字串檔案中提供本地化定義。詳情請參閱「將 LookML 模型本地化」說明文件頁面。