Si tratta di un argomento avanzato che presuppone che il lettore abbia una buona conoscenza di LookML.
Panoramica
Man mano che il modello LookML si espande in dimensioni e complessità, diventa sempre più utile riutilizzare LookML in più luoghi. Il parametro extends
ti consente di riutilizzare il codice, aiutandoti a:
- Scrivi codice DRY (senza ripetizioni), in modo da poter definire gli elementi in un unico posto e rendere il codice più coerente e più veloce da modificare
- Gestire set di campi diversi per utenti diversi
- Condividi i pattern di progettazione in diverse parti del tuo progetto
- Riutilizzare insiemi di unioni, dimensioni o misure in un progetto
Per estendere un oggetto LookML, crea un nuovo oggetto LookML e poi aggiungi il parametro extends
per indicare che il nuovo oggetto è un'estensione di un oggetto esistente. Ciò significa che il tuo progetto avrà due versioni dell'oggetto LookML. In caso di conflitti, l'oggetto in estensione avrà la precedenza e sovrascriverà le impostazioni dell'oggetto che viene esteso. Per maggiori dettagli, consulta la sezione Dettagli di implementazione di extends
più avanti in questa pagina.
Scopri i perfezionamenti di LookML:l'estensione di una vista o di un'esplorazione è l'ideale per gli scenari in cui vuoi avere più versioni della vista o dell'esplorazione. Tuttavia, se il tuo obiettivo è semplicemente quello di modificare una vista o un'esplorazione senza modificare il file LookML che la contiene, ti consigliamo di utilizzare un perfezionamento. Puoi anche utilizzare un parametro
extends
all'interno di un perfezionamento. Consulta la pagina della documentazione relativa ai perfezionamenti di LookML per ulteriori informazioni e casi d'uso.
Puoi estendere visualizzazioni, esplorazioni e dashboard LookML:
I modelli non possono essere estesi e non puoi includere un file del modello in un altro file del modello. Se invece vuoi riutilizzare o estendere le esplorazioni tra i vari modelli, puoi creare un file di esplorazione separato e poi includerlo in un file del modello.
Consulta gli esempi riportati di seguito per estendere un'esplorazione ed estendere una dashboard LookML.
Estensione di un'esplorazione
Ecco un esempio di estensione di un'esplorazione:
explore: customer {
persist_for: "12 hours"
}
explore: transaction {
extends: [customer]
persist_for: "5 minutes"
}
In questo esempio abbiamo un'esplorazione denominata Cliente e abbiamo creato una seconda esplorazione chiamata Transazione che la estende. Tutto ciò che si trova in Cliente, come i suoi join, verrà incluso in Transazione. Tutti gli elementi in Transazione rimarranno in Transazione.
Tuttavia, tieni presente che c'è un conflitto: l'esplorazione cliente indica che l'impostazione persist_for
deve durare 12 ore, mentre l'esplorazione transazione indica che deve essere di 5 minuti. Per l'esplorazione Transazione, verrà utilizzata l'impostazione persist_for: "5 minutes"
, perché sovrascrive l'impostazione dell'esplorazione che si sta estendendo.
Estensione di una dashboard LookML
Per estendere una dashboard LookML, sia le dashboard estese sia quelle estese devono essere incluse nel file del modello. Se una dashboard che utilizza il parametro extends
è inclusa in un file del modello senza la dashboard di base che si estende, riceverai un errore di convalida LookML che indica che, tra gli altri errori, non è possibile trovare la dashboard di base.
Ecco un esempio di file di dashboard:
File: faa.dashboard.lookml
- dashboard: faa
title: FAA Dashboard
layout: newspaper
elements:
- title: Aircraft Location
name: Aircraft Location
model: e_faa
explore: aircraft
type: looker_map
fields:
- aircraft.zip
- aircraft.count
sorts:
- aircraft.count desc
limit: 500
query_timezone: America/Los_Angeles
series_types: {}
row: 0
col: 0
width: 8
height: 6
Possiamo creare un nuovo file di dashboard LookML ed estendere la dashboard FAA aggiungendo un nuovo riquadro:
File: faa_additional.dashboard.lookml
- dashboard: faa_additional
title: FAA Additional
extends: faa
elements:
- title: Elevation Count
name: Elevation Count
model: e_faa
explore: airports
type: looker_scatter
fields:
- airports.elevation
- airports.count
sorts:
- airports.count desc
limit: 500
query_timezone: America/Los_Angeles
row: 0
col: 8
width: 8
height: 6
Poiché estende la dashboard FAA, la dashboard FAA Additional includerà tutti i riquadri definiti nel file faa.dashboard.lookml
. Inoltre, la dashboard FAA Additional avrà riquadri definiti nel proprio file faa_additional.dashboard.lookml
.
Il modo più semplice per creare una dashboard LookML è recuperare il codice LookML da una dashboard definita dall'utente. Puoi utilizzare questa tecnica anche per ottenere il LookML per i singoli riquadri della dashboard. Se utilizzi questo metodo, assicurati che le posizioni dei riquadri non si sovrappongano. Negli esempi faa.dashboard.lookml
e faa_additional.dashboard.lookml
, i riquadri si trovano entrambi nella prima riga della dashboard, indicata da row: 0
:
File: faa.dashboard.lookml
row: 0
col: 0
width: 8
height: 6
Tuttavia, il nuovo riquadro che stiamo aggiungendo nella dashboard FAA Additional si trova in col: 8
, quindi viene visualizzato accanto al riquadro della dashboard estesa:
File: faa_additional.dashboard.lookml
row: 0
col: 8
width: 8
height: 6
È una cosa che non c'è, dato che questi elementi si trovano in file diversi della dashboard. Pertanto, se aggiungi riquadri a una dashboard estesa, verifica la presenza di conflitti di posizionamento tra i riquadri nella dashboard estesa e i riquadri nella dashboard estesa.
Richiedere un'estensione
Puoi utilizzare il parametro extension: required
per segnalare un oggetto LookML come richiesta di estensione, il che significa che l'oggetto non può essere utilizzato da solo. Un oggetto con extension: required
non è visibile agli utenti singolarmente; è destinato solo a fungere da punto di partenza per essere esteso da un altro oggetto LookML. Il parametro extension
è supportato per le esplorazioni, le viste e le dashboard di LookML.
Non è possibile utilizzare un elemento explore
con extension: required
come explore_source
per un test dei dati. Lo strumento di convalida LookML genererà un errore in cui viene indicato che non è stato possibile trovare explore_source
.
Utilizzo dei metadati per visualizzare le estensioni di un oggetto
Puoi fare clic su un parametro explore
o view
nell'IDE di Looker e utilizzare il riquadro dei metadati per visualizzare le estensioni dell'oggetto o l'oggetto che si estende. Per informazioni, consulta la pagina della documentazione Metadati per gli oggetti LookML.
Dettagli di implementazione per extends
Ecco i passaggi che Looker esegue quando si estende un oggetto LookML:
- Copia l'oggetto che viene esteso: Looker crea una copia del codice LookML per la dashboard di visualizzazione, esplorazione o LookML che viene estesa. Questa nuova copia è l'oggetto in estensione.
- Unisci il LookML delle due copie: Looker unisce il codice LookML dell'oggetto ed esteso nell'oggetto estendente.
- Risolvi i conflitti tra le copie: nella maggior parte dei casi, se un elemento LookML viene definito sia nell'oggetto ed che nell'oggetto in estensione, viene utilizzata la versione nell'oggetto che si estende. Tuttavia, in altri casi, le estensioni combinano i valori dei parametri invece di ignorarli. Per informazioni, consulta la sezione Combinazione dei parametri in questa pagina.
- Applicare il LookML: una volta risolti tutti i conflitti, Looker interpreta il risultato LookML utilizzando la logica standard. In altre parole, Looker utilizzerà tutti i valori predefiniti e i presupposti standard come per qualsiasi altra dashboard di viste, esplorazioni o LookML.
Le sezioni seguenti mostrano i dettagli di questi passaggi, estendendo una vista come esempio. Ecco il LookML per la nostra vista di base, la vista User:
view: user {
suggestions: yes
dimension: name {
sql: ${TABLE}.name ;;
}
dimension: status {
sql: ${TABLE}.status ;;
type: number
}
}
Ecco il LookML per la vista User with Age Extensions, che estende la visualizzazione User:
include: "/views/user.view"
view: user_with_age_extensions {
extends: [user]
suggestions: no
dimension: age {
type: number
sql: ${TABLE}.age ;;
}
dimension: status {
type: string
}
}
Passaggio 1: copia il codice LookML
In questo caso, la visualizzazione user
viene estesa alla visualizzazione user_with_age_extensions
. Poiché user
è la visualizzazione che viene estesa, ne viene creata una copia prima dell'unione. Non è particolarmente importante sapere che è stata creata una copia qui; è importante sapere che la visualizzazione user
originale è rimasta invariata e può essere utilizzata normalmente.
Passaggio 2: unisci le copie
Il passaggio successivo prevede l'unione di tutto il codice LookML della vista estesa (user
) nella vista estesa (user_with_age_extensions
). È importante comprendere la natura di questa unione, che è semplicemente una fusione di oggetti LookML. In termini pratici, ciò significa che qualsiasi valore LookML scritto esplicitamente viene unito, ma i valori LookML predefiniti che non hai annotato non vengono uniti. In un certo senso, la combinazione avviene solo con il testo del codice LookML, senza il relativo significato.
Passaggio 3: risolvi i conflitti
Il terzo passaggio consiste nel risolvere gli eventuali conflitti tra le visualizzazioni unite.
Per la maggior parte, se un elemento LookML viene definito sia nell'oggetto Extendeded sia nell'oggetto Extendente, viene utilizzata la versione nell'oggetto Estensione. Tuttavia, in altri casi, le estensioni combinano i valori dei parametri invece di ignorarli. Per informazioni, consulta la sezione Combinazione dei parametri in questa pagina.
Nel caso dell'esempio user_with_age_extensions
, nessuno dei parametri è additivo e non vengono specificate opzioni di elenco o sql
parole chiave speciali. Di conseguenza, i valori dei parametri nella visualizzazione estesa sostituiranno i valori dei parametri nella visualizzazione estesa:
- Il nome della vista estendente (
user_with_age_extensions
) sostituisce il nome della vista estendente (user
). - Il valore estensione di
suggestions: no
sostituisce il valore estendetosuggestions: yes
. - La vista estesa ha una dimensione denominata
age
, che non esiste nella vista estesa (nessun conflitto). - La vista estesa ha una dimensione denominata
name
, che non esiste nella vista estesa (nessun conflitto). - Il valore
type: string
della dimensionestatus
nella visualizzazione estesa sostituisce il valoretype: number
nella visualizzazione estesa. - La dimensione
status
ha un parametrosql
che non esiste nella vista estensibile (nessun conflitto).
Il fatto che i valori LookML predefiniti non vengano ancora presi in considerazione è importante perché non vuoi sbagliare di pensare che i conflitti tra i valori predefiniti vengano risolti. In realtà, vengono semplicemente ignorati in questo passaggio. Ecco perché dobbiamo aggiungere esplicitamente parametri aggiuntivi quando estendi gli oggetti:
- Quando estendi una vista, aggiungiamo i parametri
sql_table_name
einclude
. - Quando estendi un'esplorazione, aggiungiamo i parametri
view_name
eview_label
.
In questo esempio specifico non abbiamo aggiunto sql_table_name
alla visualizzazione Utente, il che causerà alcuni problemi nel passaggio successivo.
Passaggio 4: interpreta il codice LookML come normale
Nel passaggio finale, il LookML risultante viene interpretato come normale, inclusi tutti i valori predefiniti. In questo esempio specifico, la vista LookML risultante verrà interpretata come segue:
include: "/views/user.view"
view: user_with_age_extensions {
suggestions: no
dimension: age {
type: number
sql: ${TABLE}.age ;;
}
dimension: name {
sql: ${TABLE}.name ;;
}
dimension: status {
sql: ${TABLE}.status ;;
type: string
}
}
Nota che il LookML risultante include view: user_with_age_extensions
, ma nessun parametro sql_table_name
. Di conseguenza, Looker presumerà che il valore di sql_table_name
corrisponda al nome della vista.
Il problema è che probabilmente non esiste una tabella nel nostro database denominata user_with_age_extensions
. Per questo motivo, dobbiamo aggiungere un parametro sql_table_name
a qualsiasi visualizzazione che verrà estesa. Aggiungere view_name
e view_label
alle esplorazioni che verranno estese evita problemi simili.
Combinare le estensioni
Esistono alcuni modi per utilizzare gli oggetti LookML con le estensioni:
- Un oggetto può estendere altri oggetti.
- Un oggetto che si estende può essere esteso a sua volta.
- Le estensioni possono essere utilizzate nei perfezionamenti (per ulteriori informazioni, consulta la pagina della documentazione sui perfezionamenti di LookML).
Per visualizzare un esempio di caso d'uso avanzato e leggere i suggerimenti per la risoluzione dei problemi, consulta la pagina Risoluzione dei problemi relativi a un caso d'uso avanzato di
extends
con le best practice.
Estendere più oggetti contemporaneamente
È possibile estendere più di una dashboard, vista o esplorazione contemporaneamente. Ad esempio:
explore: orders {
extends: [user_info, marketing_info]
}
# Also works for dashboards and views
Il processo di estensione funziona esattamente come descritto nell'esempio di implementazione, ma esiste un'ulteriore regola su come vengono risolti i conflitti. In caso di conflitti tra i vari elementi elencati nel parametro extends
, la priorità viene assegnata agli elementi elencati per ultimi. Quindi, nell'esempio precedente, in caso di conflitti tra user_info
e marketing_info
, verrà vinto l'esplorazione marketing_info
.
Concatenamento di più estensioni
Puoi concatenare tutte le estensioni che vuoi. Ad esempio:
explore: orders {
extends: [user_info]
...
}
explore: user_info {
extends: [marketing_info]
...
}
Anche in questo caso, il processo di estensione funziona esattamente come descritto nell'esempio di implementazione, con un'ulteriore regola per la risoluzione dei conflitti. In caso di conflitti, viene assegnata la priorità all'ultimo elemento nella catena di estensioni. In questo esempio:
orders
avrà la priorità sia suuser_info
sia sumarketing_info
.user_info
avrà la priorità sumarketing_info
.
Combinazione di parametri
Per la maggior parte, se un elemento LookML viene definito sia nell'oggetto Extendeded sia nell'oggetto Extendente, viene utilizzata la versione nell'oggetto Estensione. Questo è stato il caso nell'esempio di implementazione su questa pagina.
Tuttavia, nei seguenti casi, le estensioni combine i valori dei parametri invece di sostituirli:
- Per parametri additivi
- Con la parola chiave dell'elenco
EXTENDED*
- Con la parola chiave
${EXTENDED}
per il parametrosql
Alcuni parametri sono additivi
In molti casi, se l'oggetto che si estende contiene lo stesso parametro dell'oggetto che viene esteso, i valori dell'oggetto esteso andranno a sostituire i valori parametro dell'oggetto esteso. Tuttavia, le estensioni possono essere additive per alcuni parametri, nel senso che i valori dell'oggetto in estensione vengono utilizzati insieme ai valori dell'oggetto esteso.
I seguenti parametri sono additivi:
Per dimensioni e misure:
Per i parametri:
Per le tabelle derivate:
Per le visualizzazioni:
Per le esplorazioni:
Nell'esempio seguente, la vista carriers
ha una dimensione name
con un parametro 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"
}
}
}
Ed ecco la vista carriers_extended
, che estende la visualizzazione di carriers
. La vista carriers_extended
ha anche una dimensione name
con impostazioni diverse nel parametro link
:
include: "/views/carriers.view.lkml"
view: carriers_extended {
extends: [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"
}
}
}
Nella vista carriers_extended
, i due parametri link
sono additivi, quindi la dimensione name
mostrerà entrambi i link.
Opzioni aggiuntive con elenchi
Quando lavori con gli elenchi, puoi scegliere di combinarli, anziché lasciare che l'elenco dell'oggetto in estensione sia il vincitore. Considera questa semplice estensione con un elenco in conflitto chiamato animals
:
view: pets {
extends: fish
set: animals {
fields: [dog, cat]
}
}
view: fish {
set: animals {
fields: [goldfish, guppy]
}
}
In questo caso, la vista pets
si sta estendendo e pertanto vincerà, facendo in modo che animals
contenga [dog, cat]
. Tuttavia, utilizzando l'insieme speciale EXTENDED*
, puoi combinare gli elenchi:
view: pets {
extends: fish
set: animals {
fields: [dog, cat, EXTENDED*]
}
}
view: fish {
set: animals {
fields: [goldfish, guppy]
}
}
Ora l'elenco animals
conterrà [dog, cat, goldfish, guppy]
.
Combinare anziché sostituire durante la risoluzione dei conflitti
Nella maggior parte dei casi, in caso di conflitti durante l'estensione, vince l'oggetto che si estende. Ad esempio, prendiamo questa semplice estensione:
view: product_short_descriptions {
extends: products
dimension: description {
sql: ${TABLE}.short_description ;;
}
}
view: products {
dimension: description {
sql: ${TABLE}.full_description ;;
}
}
Puoi notare un conflitto del parametro sql
all'interno della dimensione description
. In genere, la definizione di product_short_descriptions
semplicemente sovrascriverà la definizione di products
perché sta eseguendo l'estensione.
Tuttavia, se vuoi, puoi anche scegliere di combine le definizioni. A questo scopo, utilizza la parola chiave ${EXTENDED}
nel seguente modo:
view: product_short_descriptions {
extends: products
dimension: description {
sql: LEFT(${EXTENDED}, 50) ;;
}
}
view: products {
dimension: description {
sql: ${TABLE}.full_description ;;
}
}
Ora il conflitto del parametro sql
verrà risolto in modo diverso. Anziché la definizione product_short_descriptions
vincente, prenderà la definizione di products
e la inserirà dove viene utilizzato ${EXTENDED}
. La definizione di description
in questo caso sarà: LEFT(${TABLE}.full_description, 50)
.
Aspetti da considerare
Progetti con localizzazione
Quando estendi un oggetto, tieni presente che le regole di localizzazione si applicano anche alle tue estensioni. Se intendi estendere un oggetto e definire nuove etichette o descrizioni, devi fornire le definizioni della localizzazione nei file di stringhe delle impostazioni internazionali del progetto. Per ulteriori informazioni, consulta la pagina della documentazione Localizzazione del modello LookML.