資料群組

用量

datagroup: datagroup_name {
  max_cache_age: "24 hours"
  sql_trigger: SELECT max(id) FROM my_tablename ;;
  interval_trigger: "12 hours"
  label: "desired label"
  description: "description string"
}
階層
datagroup
預設值
無

接受
資料群組的 ID,以及定義資料群組屬性的子參數。

定義

使用 datagroup 為探索指派快取政策,和/或為永久衍生資料表 (PDT) 指定保留策略。如要為不同的探索和 PDT 設定多項政策,請使用個別的 datagroup 參數指定每項政策。

請為資料群組提供不重複的名稱,只能使用英文字母、數字和底線。不得使用其他字元。

您可以為資料群組新增標籤和說明:

使用 datagroup 子參數指定快取和持續性政策的詳細資料:

  • max_cache_age:指定定義時間範圍的字串。如果查詢快取時間超過這個時間範圍,Looker 就會使快取失效。下次發出查詢時,Looker 會將查詢傳送至資料庫,以取得最新結果。詳情請參閱本頁的「max_cache_age」一節。
  • sql_trigger:指定傳回一列一欄的 SQL 查詢。如果查詢傳回的值與查詢先前的結果不同,資料群組就會進入觸發狀態。詳情請參閱本頁的「sql_trigger」一節。
  • interval_trigger:指定觸發資料群組的時間表,例如 "24 hours"。詳情請參閱本頁的「interval_trigger」一節。

通常最好的解決方案是搭配使用 max_cache_age 和 sql_trigger 或 interval_trigger。指定與資料載入 (ETL) 至資料庫相符的 sql_trigger 或 interval_trigger 值,然後指定 max_cache_age 值,以便在 ETL 失敗時使舊資料失效。max_cache_age 參數可確保如果 sql_trigger 或 interval_trigger 未清除資料群組的快取,快取項目會在特定時間過期。這樣一來,資料群組的失敗模式就會是查詢資料庫,而不是從 Looker 快取提供過時資料。

資料群組不得同時含有 sql_trigger 和 interval_trigger 參數。如果您使用這兩個參數定義資料群組,資料群組會使用 interval_trigger 值並忽略 sql_trigger 值,因為查詢資料庫時,sql_trigger 參數需要使用資料庫資源。

如果連線使用使用者屬性指定連線參數,則必須使用 PDT 覆寫欄位建立個別連線,才能使用 SQL 查詢觸發條件定義資料群組快取政策。

如果沒有 PDT 覆寫,只要使用 max_cache_age (而非 sql_trigger) 定義資料群組的快取政策,您還是可以將資料群組用於模型及其探索。

max_cache_age

max_cache_age 參數會指定一個字串,其中包含整數,後接「seconds」、「minutes」或「hours」。這個時間範圍是「探索」查詢使用資料群組時,可使用快取結果的最長期限。

當查詢快取的存留時間超過 max_cache_age 時,Looker 會使快取失效。下次發出查詢時,Looker 會將查詢傳送至資料庫,以取得最新結果。如要瞭解資料在快取中的儲存時間,請參閱「快取查詢」說明文件頁面。

max_cache_age 參數只會定義快取失效的時間,不會觸發 PDT 重建作業。如果只使用 max_cache_age 定義資料群組,且任何衍生資料表都已指派給該資料群組,您就會收到 LookML 驗證警告。如果您將衍生資料表指派給只有 max_cache_age 參數的資料群組,系統會在首次查詢資料表時建構衍生資料表,但衍生資料表會無限期保留在臨時結構定義中,即使再次查詢也不會重建。如要以特定時間間隔重建 PDT,請在資料群組中加入 interval_trigger 參數,定義 PDT 重建時間表。

設定 max_cache_age 時,如果資料群組用於深度巢狀 PDT 結構 (多層依附元件的 PDT 鏈結),請確保快取保留期限夠長,以免在重新整理期間發生競爭狀況。詳情請參閱「深層巢狀 PDT 的最佳做法」。

sql_trigger

使用 sql_trigger 參數指定 SQL 查詢,該查詢會傳回剛好一個資料列和一個資料欄。Looker 會按照資料庫連線的「資料群組與 PDT 維護時間表」欄位中指定的時間間隔,執行 SQL 查詢。如果查詢傳回的值與先前的結果不同,資料群組就會進入觸發狀態。觸發資料群組後,Looker 會重建任何在 datagroup_trigger 參數中指定該資料群組的 PDT。PDT 重建完成後,資料群組會進入就緒狀態,而 Looker 會使使用該資料群組的任何「探索」快取結果失效。

通常 sql_trigger 會指定 SQL 查詢,指出何時發生新的資料載入 (ETL),例如查詢資料表中的 max(ID)。您也可以使用 sql_trigger 查詢目前日期,並視需要將額外時數加到該時間戳記,藉此指定特定時間,例如凌晨 4 點。

請注意 sql_trigger 的下列重要事項:

  • 如果資料庫連線使用 OAuth 或使用者屬性,且您已停用連線的 PDT,就無法使用 sql_trigger。這是因為 Looker 需要靜態憑證才能存取資料庫,並執行 sql_trigger 參數中指定的查詢。啟用 PDT 後,即使連線使用 OAuth 或使用者屬性等動態憑證,您仍可使用「PDT Overrides」(PDT 覆寫) 欄位,為 PDT 程序提供個別的靜態登入憑證。不過,如果停用 PDT,且連線使用 OAuth 或使用者屬性,您就無法提供 sql_trigger 查詢所需的靜態使用者憑證給 Looker。
  • Looker 不會對 sql_trigger 執行時區轉換。如要在一天中的特定時間觸發資料群組,請在資料庫設定的時區中設定觸發條件。

如需設定 SQL 查詢來觸發資料群組的相關構想,請參閱 sql_trigger 參數說明文件中的範例。

interval_trigger

您可以使用選用的 interval_trigger 子參數,指定重建的時間長度。在 interval_trigger 參數中,您會傳遞包含整數的字串,後接「seconds」、「minutes」或「hours」。

label 和 description

您可以使用選用的 label 和 description 子參數,新增自訂標籤和資料群組說明。您也可以使用語言代碼字串檔案,將這些子參數在地化。

這些子參數會顯示在「管理」面板的「資料庫」部分,以及「資料群組」頁面。如要進一步瞭解這些資料群組的顯示方式,請參閱「管理設定 - 資料群組」說明文件頁面。

範例

以下範例著重說明 datagroup 的用途,包括:

建立快取政策,在有新資料時或至少每 24 小時擷取新結果

如要建立快取政策,在有新資料可用時或至少每 24 小時擷取新結果,請按照下列步驟操作:

  • 使用 orders_datagroup 資料群組 (位於模型檔案中) 為快取政策命名。
  • 使用 sql_trigger 參數指定查詢,指出有新資料:select max(id) from my_tablename。資料更新時,這項查詢會傳回新的數字。
  • 如果資料已快取 24 小時,請使用 max_cache_age 設定使資料失效。
  • 使用選用的 label 和 description 參數,新增自訂標籤和資料群組說明。
datagroup: orders_datagroup {
  sql_trigger: SELECT max(id) FROM my_tablename ;;
  max_cache_age: "24 hours"
  label: "ETL ID added"
  description: "Triggered when new ID is added to ETL log"
}

如要將 orders_datagroup 快取政策設為模型中探索的預設政策,請在模型層級使用 persist_with 參數,並指定 orders_datagroup:

persist_with: orders_datagroup

如要為特定探索使用 orders_datagroup 快取政策,請在 explore 參數下方新增 persist_with 參數,並指定 orders_datagroup。如果模型層級指定了預設資料群組,您可以使用 explore 下的 persist_with 參數覆寫預設設定。

explore: customer_facts {
  persist_with: orders_datagroup
  ...
}

如要使用 orders_datagroup 資料群組快取政策重建 PDT,您可以在 derived_table 參數下方新增 datagroup_trigger,並指定 orders_datagroup:

view: customer_order_facts {
  derived_table: {
    datagroup_trigger: orders_datagroup
    ...
  }
}

建立資料群組,在每個月的最後一天排定傳送作業

您可能想建立排程,在每個月底傳送內容。不過,每個月的天數不盡相同。您可以建立資料群組,在每個月月底觸發內容傳送作業,無論特定月份的天數為何。

  1. 使用 SQL 陳述式建立資料群組,在每個月底觸發:

    datagroup: month_end_datagroup {
    sql_trigger: SELECT (EXTRACT(MONTH FROM DATEADD( day, 1, GETDATE()))) ;;
    description: "Triggered on the last day of each month"
    }
    

    這個範例採用 Redshift SQL,可能需要稍微調整才能用於其他資料庫。

    這項 SQL 陳述式會傳回明天所在的月份 (如果當天是月底,明天就是下個月),因此資料群組會觸發。其他日子則會落在同一個月,因此不會觸發資料群組。

  2. 在新的或現有排程中選取資料群組。

以資料群組為準的排程只會在所有以該資料群組參數保存的 PDT 完成重新產生程序後傳送,確保傳送的內容包含最新資料。

使用具有連鎖 PDT 的資料群組

如果是永久連鎖衍生資料表,也就是在一個永久衍生資料表 (PDT) 的定義中參照另一個 PDT,您可以使用資料群組,為連鎖 PDT 指定保留策略。

舉例來說,以下是模型檔案的一部分,定義名為 user_facts_etl 的資料群組和名為 user_stuff 的探索。user_stuff 探索會透過 user_facts_etl 資料群組持續存在:

datagroup: user_facts_etl {
  sql_trigger: SELECT max(ID) FROM etl_jobs ;;
}

explore: user_stuff {
  persist_with: user_facts_etl
  from: user_facts_pdt_1
  join: user_facts_pdt_2 {
    ...
  }
  ...
}

user_stuff 探索會與 user_facts_pdt_1 檢視區塊和 user_facts_pdt_2 檢視區塊彙整。這兩個檢視區塊都是以 PDT 為基礎,並使用 user_facts_etl 資料群組做為持續性觸發條件。user_facts_pdt_2 衍生資料表會參照 user_facts_pdt_1 衍生資料表,因此這些是連鎖 PDT。以下是這些 PDT 的檢視區塊檔案中的部分 LookML:

view: user_facts_pdt_1 {
  derived_table: {
    datagroup_trigger: user_facts_etl
    explore_source: users {
      column: customer_ID {field:users.id}
      column: city {field:users.city}
      ...
    }
  }
}

view: user_facts_pdt_2 {
  derived_table: {
    sql:
      SELECT ...
      FROM ${users_facts_pdt_1.SQL_TABLE_NAME} ;;
  datagroup_trigger: user_facts_etl
  }
}

如果您有連鎖 PDT,請務必確保 PDT 沒有不相容的資料群組快取政策。

Looker 重新產生器會檢查這些 PDT 的狀態,並啟動重建作業,如下所示:

  • 根據預設,Looker 再生器每五分鐘會檢查資料群組的 sql_trigger 查詢一次 (Looker 管理員可以使用資料庫連線的「資料群組和 PDT 維護時間表」設定指定間隔)。
  • 如果 sql_trigger 查詢傳回的值與先前檢查的查詢結果不同,資料群組就會進入觸發狀態。在本例中,如果 etl_jobs 資料表有新的 ID 值,就會觸發 user_facts_etl 資料群組。
  • user_facts_etl資料群組觸發後,Looker 重建產生器會重建使用該資料群組的所有 PDT (也就是以 datagroup_trigger: user_facts_etl 定義的所有 PDT)。在本例中,重建產生器會重建 user_facts_pdt_1,然後重建 user_facts_pdt_2。

    如果 PDT 共用相同的 datagroup_trigger,再生器會依附屬關係重建 PDT,先建構其他資料表參照的資料表。如要進一步瞭解 Looker 如何重建連鎖衍生資料表,請參閱「Looker 中的衍生資料表」說明文件頁面。

  • 當再生器重建資料群組中的所有 PDT 時,再生器會將user_facts_etl資料群組從觸發狀態中取出。

  • user_facts_etl 資料群組不再處於觸發狀態後,Looker 會重設使用 user_facts_etl 資料群組的所有模型和探索的快取 (也就是以 persist_with: user_facts_etl 定義的所有模型和探索)。在本範例中,這表示 Looker 會重設 user_stuff 探索的快取。

  • 系統會傳送任何以 user_facts_etl 資料群組為依據的排定內容傳送。在本例中,如果排定傳送的內容包含「探索」user_stuff中的查詢,系統會從資料庫擷取排定的查詢,以取得最新結果。

深層巢狀 PDT 的最佳做法

使用深度巢狀 PDT 結構 (多層依附元件的 PDT 串流) 時,設定較短的快取保留期限 (例如 15 分鐘) 可能會導致競爭狀況,進而造成重新整理期間發生 409 Conflict 錯誤。

發生這種競爭狀況的原因是,較低層級巢狀 PDT 的快取可能在較高層級 PDT 仍在建構時過期。發生這種情況時,Looker 會為較低層級的 PDT 觸發新的重複建構要求,但初始作業仍在資料倉儲中處理,因此會導致衝突。

如要解決或避免這項錯誤,請採用下列最佳做法:

  • 延長快取保留期限:將衍生資料表的快取保留期限 (max_cache_age 或 persist_for) 設為至少是完成所有巢狀衍生資料表完整建構作業所需時間的兩到三倍。
  • 增加資料群組的重新整理間隔:讓系統有足夠時間完成深度巢狀 PDT 建構作業,降低建構程序重疊的風險。

在模型檔案之間共用資料群組

這個範例說明如何與多個模型檔案共用資料群組。這種做法的優點是,如果需要編輯資料群組,只要在一個地方編輯資料群組,變更就會套用至所有模型。

如要與多個模型檔案共用資料群組,請先建立只包含資料群組的獨立檔案,然後在模型檔案中使用 include 參數 include 資料群組檔案。

建立資料群組檔案

建立獨立的 .lkml 檔案來存放資料群組。您可以採用與建立個別 .lkml 探索檔案相同的方式,建立 .lkml 資料群組檔案。

在本範例中,資料群組檔案名為 datagroups.lkml:

datagroup: daily {
 max_cache_age: "24 hours"
 sql_trigger: SELECT CURRENT_DATE();;
}

在模型檔案中加入資料群組檔案

建立資料群組檔案後,您可以在兩個模型中include使用 persist_with,將資料群組套用至模型中的個別探索,或套用至模型中的所有探索。

舉例來說,下列兩個模型檔案都會include參照 datagroups.lkml 檔案。

這個檔案名為 ecommerce.model.lkml。daily 資料群組是在 explore 層級使用,因此只會套用至 orders 探索:

include: "datagroups.lkml"

connection: "database1"

explore: orders {
  persist_with: daily
}

下一個檔案名為 inventory.model.lkml。daily 資料群組是在 model 層級使用,因此會套用至模型檔案中的所有探索:

include: "datagroups.lkml"
connection: "database2"
persist_with: daily

explore: items {
}

explore: products {
}