LookML 精修

總覽

透過 LookML 精修功能,您可以調整現有的檢視畫面探索,而無須編輯包含這些項目的 LookML 檔案。這非常適合下列情況:

舉例來說,假設您的專案中有以下 View 檔案:

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 UI 中,使用者會看到「Air Carrier」維度,就像您將維度新增至原始檢視檔案本身一樣。

詳情請參閱「範例」一節。

精修與擴展的比較

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 參數的 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 Explore 含有 extends 參數,Looker 會從要擴充的物件開始處理 LookML 元素,在本例中就是 orders_base Explore。此時,label 的值為「Orders Base」。
  2. 物件精細設定中指定的 extends 值。由於 orders 包含精緻化項目,而精緻化項目包含 extends 參數,因此 Looker 會套用精緻化項目擴充功能中的 LookML 元素,在本例中為 users_base Explore。此時,label 的值為「Users Base」。
  3. 物件中的值。所有擴充功能都已處理完畢,Looker 會套用擴充物件的元素,在本例中就是 orders Explore。如果發生任何衝突,則擴充物件會勝出。因此,label 值現在是「Orders」。
  4. 物件精細資料的值。最後,Looker 會套用 orders Explore 的任何精修項目元素。如果有任何衝突,則精緻化物件會勝出。因此,label 的值現在是「Orders Refined」。

分類標籤 extends 是外加規則

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

舉例來說,以下是名為 orders_base 的基礎探索,以及擴充基礎的 orders 探索。此外,還有 users_base Explore 和 +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 Explore 會擴充 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 會發出警告。
    • 在模型檔案中,加入定義精修項目的檔案。您可以結合檔案並以非常有創意的方式使用包含項目。詳情請參閱本頁的「使用精緻化功能為模型新增圖層」一節。

範例

只要調整 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 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 檔案包含下列內容:

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

最終結果會像是原始的 aircraft 探索和 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 盡量提高程式碼重複使用性:為多種用途自訂單一基礎檢視畫面」教戰手冊食譜。

精修功能的其他用途

如前所述,精修功能非常適合用於調整 LookML 唯讀物件,例如 Looker 區塊匯入的檔案

不過,一旦您熟悉如何在模型中加入精緻化內容,就可以在專案中執行非常酷炫的操作,如以下範例所述。

使用精進項目新增分析

您可以使用精修功能,在模型中新增分析,而無須修改原始 LookML 檔案。舉例來說,如果某個專案的檢視畫面和探索是由資料庫中的資料表產生,並儲存在名為 faa_basic.lkml 的 LookML 檔案中,您可以建立 faa_analysis.lkml 檔案,並使用精修功能新增分析。以下是名為 distance_stats 的新衍生資料表範例,其中包含距離分析。這個範例說明如何從 faa_basic.lkml 檔案中精進現有的 flights 探索,將 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 模型本地化」說明文件。