Looker 食譜:充分運用 Looker 中的衍生資料表

衍生資料表可提供多種進階分析功能,但可能難以使用、實作及疑難排解。這份錦囊妙計包含 Looker 衍生資料表最熱門的用途。

本頁面包含下列範例:

衍生資料表資源

這些錦囊妙計假設您對 LookML 和衍生資料表已有初步瞭解。您應熟悉如何建立檢視表及編輯模型檔案。如要複習這些主題,請參閱下列資源:

每天凌晨 3 點建立資料表

在這個例子中,資料會在每天凌晨 2 點傳入。無論是在凌晨 3 點或晚上 9 點執行查詢,結果都相同。因此,建議您每天建立一次資料表,讓使用者從快取中提取結果。

在模型檔案中加入資料群組,即可在多個資料表和探索中重複使用。這個資料群組包含 sql_trigger_value 參數,可告知資料群組何時觸發及重建衍生資料表。

如需更多觸發條件運算式範例,請參閱 sql_trigger_value 說明文件。


## in the model file

datagroup: standard_data_load {
  sql_trigger_value: SELECT FLOOR(((TIMESTAMP_DIFF(CURRENT_TIMESTAMP(),'1970-01-01 00:00:00',SECOND)) - 60*60*3)/(60*60*24)) ;;
  max_cache_age: "24 hours"
}

explore: orders {
…

在檢視表檔案中,將 datagroup_trigger 參數新增至 derived_table 定義,並指定要使用的資料群組名稱。在這個範例中,資料群組為 standard_data_load。


view: orders {
 derived_table: {
  indexes: ["id"]
  datagroup_trigger: standard_data_load
    sql:
      SELECT
        user_id,
        id,
        created_at,
        status
      FROM
        demo_db.orders
      GROUP BY
        user_id ;;
    }

…
}

將新資料附加至大型資料表

永久累加型衍生資料表是一種永久衍生資料表,Looker 會將新資料附加至資料表,而不是重新建構整個資料表。

下一個範例以 orders 資料表範例為基礎,說明資料表如何逐步建構。每天都會有新的訂單資料,只要新增 increment_key 參數和 increment_offset 參數,就能將這些資料附加至現有資料表。


view: orders {
 derived_table: {
    indexes: ["id"]
    increment_key: "created_at"
    increment_offset: 3
    datagroup_trigger: standard_data_load
    distribution_style: all
    sql:
      SELECT
        user_id,
        id,
        created_at,
        status
      FROM
        demo_db.orders
      GROUP BY
        user_id ;;
    }

  dimension: id {
    primary_key: yes
    type: number
    sql: ${TABLE}.id ;;  }

…
}

increment_key 值設為 created_at,也就是本例中應查詢最新資料並附加至 PDT 的時間增量。

increment_offset 值設為 3,指定要重建多少個先前的時間範圍 (以增量鍵的精細程度為準),以納入延遲到達的資料。

使用 SQL 視窗函式

部分資料庫方言支援視窗函式,特別是用於建立序號、主鍵、累計總和,以及其他實用的多列計算。主要查詢執行完畢後,系統會另外執行所有 derived_column 宣告。

如果資料庫方言支援視窗函式,您可以在原生衍生資料表中使用這些函式。建立 derived_column 參數,並使用包含視窗函式的 sql 參數。參照值時,請使用原生衍生資料表定義的資料欄名稱。

以下範例說明如何建立包含 user_id、order_id 和 created_time 欄的原生衍生資料表。接著,您可以使用衍生資料欄和 SQL ROW_NUMBER() 視窗函式,計算出包含顧客訂單序號的資料欄。

view: user_order_sequences {
  derived_table: {
    explore_source: order_items {
      column: user_id {
        field: order_items.user_id
      }
      column: order_id {
        field: order_items.order_id
      }
      column: created_time {
        field: order_items.created_time
      }
      derived_column: user_sequence {
        sql: ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_time) ;;
      }
    }
  }
  dimension: order_id {
    hidden: yes
  }
  dimension: user_sequence {
    type: number
  }
}

建立衍生資料欄來存放計算值

您可以新增 derived_column 參數,指定 explore_source 參數的「探索」中不存在的資料欄。每個 derived_column 參數都有一個 sql 參數,用於指定值的建構方式。

sql 計算可以使用您透過 column 參數指定的任何資料欄。衍生資料欄不能包含匯總函式,但可以包含可在表格單一資料列執行的計算。

這個範例會建立 average_customer_order 欄,並根據原生衍生資料表中的 lifetime_customer_value 和 lifetime_number_of_orders 欄計算。

view: user_order_facts {
  derived_table: {
    explore_source: order_items {
      column: user_id {
        field: users.id
      }
      column: lifetime_number_of_orders {
        field: order_items.count
      }
      column: lifetime_customer_value {
        field: order_items.total_profit
      }
      derived_column: average_customer_order {
        sql:  lifetime_customer_value / lifetime_number_of_orders ;;
      }
    }
  }

  dimension: user_id {
    hidden: yes
  }
  dimension: lifetime_number_of_orders {
    type: number
  }
  dimension: lifetime_customer_value {
    type: number
  }
  dimension: average_customer_order {
    type: number
  }
}

最佳化策略

PDT 儲存在資料庫中,因此請根據方言支援情況,使用下列策略最佳化 PDT:

舉例來說,如要新增永久性,您可以將 PDT 設為在資料群組 orders_datagroup 觸發時重建,然後在 customer_id 和 first_order 上新增索引,如下所示:

view: customer_order_summary {
  derived_table: {
    explore_source: orders {
      ...
    }
    datagroup_trigger: orders_datagroup
    indexes: ["customer_id", "first_order"]
  }
}

如果未新增索引 (或方言的對等項目),Looker 會警告您應新增索引,以提升查詢效能。

使用 PDT 測試最佳化

您可以使用 PDT 測試不同的索引、分布和其他最佳化選項,不需要資料庫管理員或 ETL 開發人員的大量支援。

假設您有一個資料表,但想測試不同的索引。檢視表的初始 LookML 可能如下所示:

view: customer {
  sql_table_name: warehouse.customer ;;
}

如要測試最佳化策略,可以使用 indexes 參數,將索引新增至 LookML,如下所示:

view: customer {
  # sql_table_name: warehouse.customer
  derived_table: {
    sql: SELECT * FROM warehouse.customer ;;
    persist_for: "8 hours"
    indexes: [customer_id, customer_name, salesperson_id]
  }
}

查詢檢視表一次,即可生成 PDT。接著執行測試查詢並比較結果。如果結果良好,可以請 DBA 或 ETL 團隊將索引新增至原始資料表。

UNION 個資料表

如果 SQL 方言支援,您可以在兩個衍生資料表中執行 SQL UNION 或 UNION ALL 運算子。UNION 和 UNION ALL 運算子會合併兩項查詢的結果集。

以下範例顯示以 SQL 為基礎的衍生資料表,其中包含 UNION:

view: first_and_second_quarter_sales {
  derived_table: {
    sql:
       SELECT * AS sales_records
       FROM sales_records_first_quarter
       UNION
       SELECT * AS sales_records
       FROM sales_records_second_quarter ;;
   }
}

sql 參數中的 UNION 陳述式會產生衍生資料表,合併兩項查詢的結果。

UNION 和 UNION ALL 的差異在於 UNION ALL 不會移除重複的資料列。使用 UNION 和 UNION ALL 時,請考量效能,因為資料庫伺服器必須執行額外工作,才能移除重複的資料列。

計算總和的總和 (將測量結果維度化)

在 SQL (以及 Looker) 中,一般規則是無法依匯總函式的結果 (在 Looker 中以測量指標表示) 將查詢分組。您只能依未匯總的欄位 (在 Looker 中稱為「維度」) 分組。

如要依匯總資料分組 (例如加總總和),您必須將測量指標「維度化」。其中一個方法是使用衍生資料表,有效建立匯總的子查詢。

Looker 可以從「探索」開始,為全部或大部分的衍生資料表生成 LookML。只要建立探索,並選取要納入衍生資料表的所有欄位,接著,請按照下列步驟,產生原生 (或以 SQL 為基礎) 衍生資料表的 LookML:

  1. 按一下「探索」的齒輪選單,然後選取「取得 LookML」。

  2. 如要查看為「探索」建立原生衍生資料表的 LookML,請點選「衍生資料表」分頁標籤。

  3. 複製 LookML。

複製產生的 LookML 後,請按照下列步驟,將程式碼貼到檢視表檔案:

  1. 在「開發模式」中,前往專案檔案。

  2. 在 Looker IDE 中,點選專案檔案清單頂端的「+」,然後選取「建立檢視表」。或者,如要在資料夾中建立檔案,請點選資料夾選單,然後選取「建立檢視表」。

  3. 將檢視表名稱設為有意義的名稱。

  4. 視需要變更資料欄名稱、指定衍生資料欄,以及新增篩選器。

具備匯總感知功能的匯總表格

在 Looker 中,您可能會經常遇到非常龐大的資料集或資料表,需要使用匯總表格或匯總,才能確保效能。

Looker 的匯總感知功能可讓您預先建構匯總表格,設定各種精細程度、維度和匯總方式,並告知 Looker 如何在現有的探索中使用這些表格。Looker 會在適當情況下,自動使用這些匯總表格執行查詢,使用者不需輸入任何內容。這能縮減查詢大小、縮短等待時間,並提升使用者體驗。

以下示範如何在 Looker 模型中進行非常簡單的實作,說明匯總感知功能有多輕量。假設資料庫中有一個航班資料表,其中每一列代表 FAA 記錄的航班,您可以在 Looker 中使用專屬檢視表和探索,為這個資料表建立模型。以下是可為「探索」定義的匯總表格 LookML:

  explore: flights {
    aggregate_table: flights_by_week_and_carrier {
      query: {
        dimensions: [carrier, depart_week]
        measures: [cancelled_count, count]
      }

      materialization: {
        sql_trigger_value: SELECT CURRENT-DATE;;
      }
    }
  }

有了這個匯總表格,使用者就能查詢「flights」探索,Looker 則會自動使用匯總表格回答查詢。如需更詳細的匯總感知功能逐步操作說明,請參閱匯總感知功能教學課程。