Code mit Erweiterungen wiederverwenden

Dies ist ein fortgeschrittenes Thema, bei dem vorausgesetzt wird, dass die Lesenden über fundierte Kenntnisse in LookML verfügen.

Übersicht

Je größer und komplexer Ihr LookML-Modell wird, desto nützlicher ist es, die LookML an mehreren Stellen wiederzuverwenden. Mit dem Parameter extends können Sie Code wiederverwenden. Das bietet folgende Vorteile:

  • Schreiben Sie DRY-Code (Don't Repeat Yourself, d. h. „Nicht wiederholen“), damit Sie Dinge nur an einer Stelle definieren können. So wird Ihr Code konsistenter und lässt sich schneller bearbeiten.
  • Verschiedene Feldsätze für unterschiedliche Nutzer verwalten
  • Designmuster in verschiedenen Teilen Ihres Projekts teilen
  • Gruppen von Joins, Dimensionen oder Messwerten in einem Projekt wiederverwenden

Wenn Sie ein LookML-Objekt erweitern möchten, erstellen Sie ein neues LookML-Objekt und fügen Sie dann den Parameter extends hinzu, um anzugeben, dass das neue Objekt eine Erweiterung eines vorhandenen Objekts ist. Das bedeutet, dass Ihr Projekt zwei Versionen des LookML-Objekts hat. Bei Konflikten hat das erweiterte Objekt Vorrang und überschreibt die Einstellungen des erweiterten Objekts. Weitere Informationen finden Sie im Abschnitt Implementierungsdetails für extends weiter unten auf dieser Seite.

LookML-Optimierungen ansehen: Das Erweitern einer Ansicht oder eines Explores eignet sich ideal für Szenarien, in denen Sie mehrere Versionen der Ansicht oder des Explores benötigen. Wenn Ihr Ziel jedoch darin besteht, eine Ansicht oder ein Explore zu ändern, ohne die entsprechende LookML-Datei zu bearbeiten, können Sie stattdessen einen Suchfilter verwenden. Sie können auch einen extends-Parameter in einer Verfeinerung verwenden. Weitere Informationen und Anwendungsfälle finden Sie auf der Dokumentationsseite LookML-Optimierungen.

Sie können Ansichten, Explores und LookML-Dashboards erweitern:

Modelle können nicht erweitert werden und Sie können keine Modelldatei in eine andere Modelldatei einfügen. Wenn Sie Explores modellübergreifend wiederverwenden oder erweitern möchten, können Sie stattdessen eine separate Explore-Datei erstellen und dann diese Explore-Datei in eine Modelldatei aufnehmen.

In den folgenden Beispielen wird gezeigt, wie Sie ein Explore und ein LookML-Dashboard erweitern.

Explores erweitern

Hier ist ein Beispiel für die Erweiterung eines Explores:

explore: customer {
  persist_for: "12 hours"
}

explore: transaction {
  extends: [customer]
  persist_for: "5 minutes"
}

In diesem Beispiel haben wir ein Explore namens Kunde und ein zweites Explore namens Transaktion erstellt, das es erweitert. Alles, was in Kunden enthalten ist, z. B. Joins, wird in Transaktion aufgenommen. Alles, was sich unter Transaktion befindet, bleibt unter Transaktion.

Beachten Sie jedoch, dass es einen Konflikt gibt: Im explorativen Datenbestand Kunden sollte die Einstellung persist_for 12 Stunden betragen, im explorativen Datenbestand Transaktionen jedoch 5 Minuten. Für das explorative Datenanalysetool Transaktion wird die Einstellung persist_for: "5 minutes" verwendet, da sie die Einstellung des erweiterten explorativen Datenanalysetools überschreibt.

LookML-Dashboard erweitern

Um ein LookML-Dashboard zu erweitern, müssen sowohl das erweiterte als auch das erweiterte Dashboard in der Modelldatei enthalten sein. Wenn ein Dashboard mit dem Parameter extends in einer Modelldatei enthalten ist, aber das Basisdashboard, das es erweitert, nicht, erhalten Sie unter anderem einen LookML-Validierungsfehler, dass das Basisdashboard nicht gefunden werden kann.

Hier sehen Sie eine Beispiel-Dashboarddatei:

Datei: 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

Wir können eine neue LookML-Dashboard-Datei erstellen und das FAA-Dashboard um eine neue Kachel erweitern:

Datei: 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

Da es das FAA-Dashboard erweitert, enthält das FAA Additional-Dashboard alle Kacheln, die in der Datei faa.dashboard.lookml definiert sind. Außerdem enthält das Dashboard FAA Additional alle Kacheln, die in einer eigenen faa_additional.dashboard.lookml-Datei definiert sind.

Am einfachsten erstellen Sie ein LookML-Dashboard, indem Sie den LookML-Code aus einem benutzerdefinierten Dashboard abrufen. Mit dieser Technik können Sie auch den LookML-Code für einzelne Dashboard-Tiles abrufen. Wenn Sie diese Methode verwenden, achten Sie darauf, dass sich die Positionen Ihrer Kacheln nicht überschneiden. In den Beispielen faa.dashboard.lookml und faa_additional.dashboard.lookml befinden sich die Kacheln in der obersten Zeile des Dashboards, die durch row: 0 gekennzeichnet ist:

Datei: faa.dashboard.lookml


    row: 0
    col: 0
    width: 8
    height: 6

Die neue Kachel, die wir dem zusätzlichen FAA-Dashboard hinzufügen, befindet sich jedoch in col: 8 und wird daher neben der Kachel des erweiterten Dashboards angezeigt:

Datei: faa_additional.dashboard.lookml


    row: 0
    col: 8
    width: 8
    height: 6

Dies ist leicht zu übersehen, da sich diese Elemente in verschiedenen Dashboard-Dateien befinden. Wenn Sie also Tiles zu einem erweiterten Dashboard hinzufügen, achten Sie darauf, ob Positionierungskonflikte zwischen den Tiles im erweiterten Dashboard und den Tiles im erweiterten Dashboard vorhanden sind.

Verlängerung erforderlich

Mit dem Parameter extension: required können Sie ein LookML-Objekt als Erweiterung kennzeichnen, was bedeutet, dass es nicht alleine verwendet werden kann. Ein Objekt mit extension: required ist für Nutzer nicht sichtbar. Es dient nur als Ausgangspunkt, der von einem anderen LookML-Objekt erweitert werden kann. Der Parameter extension wird für Explores, Ansichten und LookML-Dashboards unterstützt.

Ein explore mit extension: required kann nicht als explore_source für einen Datentest verwendet werden. Der LookML Validator generiert einen Fehler, der besagt, dass die explore_source nicht gefunden werden kann.

Metadaten zum Aufrufen von Erweiterungen für ein Objekt verwenden

Klicken Sie in der Looker-IDE auf einen explore- oder view-Parameter und sehen Sie sich im Metadatenbereich an, ob es Erweiterungen für das Objekt gibt oder um welches Objekt es sich handelt. Weitere Informationen finden Sie auf der Dokumentationsseite Metadaten für LookML-Objekte.

Implementierungsdetails für extends

So erweitert Looker ein LookML-Objekt:

  1. Objekt kopieren, das erweitert wird: In Looker wird eine Kopie der LookML für die Ansicht, das Explore oder das LookML-Dashboard erstellt, das erweitert wird. Diese neue Kopie ist das erweiterte ing-Objekt.
  2. LookML der beiden Kopien zusammenführen: In Looker wird die LookML des erweiterten Objekts mit dem erweiterten Objekt zusammengeführt.
  3. Konflikte zwischen den Kopien beheben: Wenn ein LookML-Element sowohl im erweiterten als auch im erweiternden Objekt definiert ist, wird in den meisten Fällen die Version im erweiterten Objekt verwendet. In anderen Fällen kombinieren Erweiterungen jedoch Parameterwerte, anstatt sie zu überschreiben. Weitere Informationen finden Sie auf dieser Seite im Abschnitt Parameter kombinieren.
  4. LookML anwenden: Sobald alle Konflikte behoben sind, interpretiert Looker die resultierende LookML mit der Standardlogik. Mit anderen Worten: Looker verwendet alle Standardeinstellungen und -annahmen wie bei jeder anderen Ansicht, jedem Explore oder jedem LookML-Dashboard.

In den folgenden Abschnitten werden die einzelnen Schritte beschrieben. Als Beispiel dient das Maximieren einer Ansicht. Hier ist der LookML-Code für unsere Basisansicht, die Ansicht User, zu sehen:

view: user {
  suggestions: yes

  dimension: name {
    sql: ${TABLE}.name ;;

  }
  dimension: status {
    sql: ${TABLE}.status ;;
    type: number
  }
}

Hier ist die LookML für die Ansicht Nutzer mit Altersgruppen, die die Ansicht Nutzer erweitert:

include: "/views/user.view"

view: user_with_age_extensions {
  extends: [user]
  suggestions: no

  dimension: age {
    type: number
    sql: ${TABLE}.age ;;
  }

  dimension: status {
    type: string
  }
}

Schritt 1: LookML kopieren

In diesem Fall wird die Ansicht user auf die Ansicht user_with_age_extensions erweitert. Da user die Ansicht ist, die erweitert wird, wird vor dem Zusammenführen eine Kopie davon erstellt. Die Tatsache, dass eine Kopie erstellt wird, ist hier nicht besonders wichtig. Die ursprüngliche user-Ansicht bleibt unverändert und kann wie gewohnt verwendet werden.

Schritt 2: Kopien zusammenführen

Im nächsten Schritt wird die gesamte LookML aus der erweiterten Ansicht (user) in die erweiternde Ansicht (user_with_age_extensions) zusammengeführt. Es ist wichtig, die Art dieser Zusammenführung zu verstehen. Es handelt sich dabei einfach um eine Zusammenführung von LookML-Objekten. In der Praxis bedeutet das, dass alle explizit geschriebenen LookML-Werte zusammengeführt werden, die standardmäßigen LookML-Werte, die Sie nicht selbst eingegeben haben, werden nicht zusammengeführt. In gewisser Weise ist es nur der Text des LookML-Codes, der zusammengesetzt wird, und keine der Bedeutung dieses Textes.

Schritt 3: Konflikte beheben

Im dritten Schritt werden alle Konflikte zwischen den zusammengeführten Datenansichten behoben.

Wenn ein LookML-Element sowohl im erweiterten als auch im erweiternden Objekt definiert ist, wird in den meisten Fällen die Version im erweiterten Objekt verwendet. In anderen Fällen kombinieren Erweiterungen jedoch Parameterwerte, anstatt sie zu überschreiben. Weitere Informationen finden Sie auf dieser Seite im Abschnitt Parameter kombinieren.

Im Fall des user_with_age_extensions-Beispiels ist keiner der Parameter additiv und es sind keine speziellen Listenoptionen oder sql-Keywords angegeben. Daher überschreiben die Parameterwerte in der erweiterten Ansicht die Parameterwerte in der erweiterten Ansicht:

  • Der Name der erweiterten Ansicht (user_with_age_extensions) überschreibt den Namen der erweiterten Ansicht (user).
  • Der Wert „extending“ (in der Erweiterung) für suggestions: no überschreibt den Wert „extended“ (erweitert) suggestions: yes.
  • Die erweiternde Ansicht hat die Dimension age, die in der erweiterten Ansicht nicht vorhanden ist (kein Konflikt).
  • Die erweiterte Ansicht hat die Dimension name, die in der erweiterten Ansicht nicht vorhanden ist (kein Konflikt).
  • Der Wert type: string der Dimension status in der erweiterten Ansicht überschreibt den Wert type: number in der erweiterten Ansicht.
  • Die Dimension status hat einen Parameter sql, der in der erweiterten Datenansicht nicht vorhanden ist (kein Konflikt).

Die Tatsache, dass LookML-Standardwerte noch nicht berücksichtigt werden, ist wichtig, da Sie nicht den Fehler machen möchten, dass Konflikte zwischen Standardwerten gelöst werden. Tatsächlich werden sie bei diesem Schritt einfach ignoriert. Deshalb müssen wir beim Erweitern von Objekten zusätzliche Parameter explizit hinzufügen:

In diesem Beispiel haben wir der Ansicht Nutzer nicht sql_table_name hinzugefügt, was im nächsten Schritt zu Problemen führen wird.

Schritt 4: LookML wie gewohnt interpretieren

Im letzten Schritt wird das resultierende LookML als normal interpretiert, einschließlich aller Standardwerte. In diesem Beispiel würde die resultierende Looker-Ansicht so interpretiert:

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
  }
}

Beachten Sie, dass die resultierende LookML view: user_with_age_extensions, aber keinen sql_table_name-Parameter enthält. Daher wird in Looker davon ausgegangen, dass der Wert von sql_table_name dem Namen der Ansicht entspricht.

Das Problem ist, dass es in unserer Datenbank wahrscheinlich keine Tabelle mit dem Namen user_with_age_extensions gibt. Deshalb müssen wir jeder Ansicht, die erweitert werden soll, einen sql_table_name-Parameter hinzufügen. Durch das Hinzufügen von view_name und view_label zu Explores, die erweitert werden, können ähnliche Probleme vermieden werden.

Kombinieren von Erweiterungen

Es gibt mehrere Möglichkeiten, LookML-Objekte mit Erweiterungen zu nutzen:

Ein Beispiel für einen erweiterten Anwendungsfall sowie Tipps zur Fehlerbehebung finden Sie auf der Seite mit den Best Practices zur Fehlerbehebung für einen erweiterten Anwendungsfall mit extends.

Mehrere Objekte gleichzeitig verlängern

Es ist möglich, mehrere Dashboards, Ansichten oder Explores gleichzeitig zu erweitern. Beispiel:

explore: orders {
  extends: [user_info, marketing_info]
}
# Also works for dashboards and views

Die Erweiterung funktioniert genau wie im Implementierungsbeispiel beschrieben. Es gibt jedoch eine zusätzliche Regel für die Konfliktlösung. Bei Konflikten zwischen den Elementen, die im Parameter extends aufgeführt sind, werden den zuletzt aufgeführten Elementen Priorität zugewiesen. Wenn also im Beispiel oben Konflikte zwischen user_info und marketing_info auftreten, wird die explorative Datenanalyse marketing_info verwendet.

Verkettung mehrerer Erweiterungen

Sie können auch beliebig viele Erweiterungen verketten. Beispiel:

explore: orders {
  extends: [user_info]
  ...
}
explore: user_info {
  extends: [marketing_info]
  ...
}

Auch hier funktioniert die Erweiterung genauso wie im Implementierungsbeispiel beschrieben, mit einer zusätzlichen Regel zur Konfliktlösung. Bei Konflikten hat das letzte Element in der Erweiterungskette Vorrang. In diesem Fall gilt Folgendes:

  • orders hat dann Vorrang vor user_info und marketing_info.
  • user_info hat Vorrang vor marketing_info.

Parameter kombinieren

Wenn ein LookML-Element sowohl im erweiterten als auch im erweiternden Objekt definiert ist, wird in den meisten Fällen die Version im erweiterten Objekt verwendet. Dies war auch im Implementierungsbeispiel auf dieser Seite der Fall.

In den folgenden Fällen kombinieren Erweiterungen jedoch Parameterwerte, anstatt die Werte zu überschreiben:

Einige Parameter sind additiv

Wenn das erweiterbare Objekt denselben Parameter wie das zu erweiternde Objekt enthält, werden die Parameterwerte des erweiterten Objekts durch die Werte des erweiterten Objekts überschrieben. Erweiterungen können jedoch für einige Parameter additiv sein. Das bedeutet, dass die Werte des erweiterten Objekts zusammen mit den Werten aus dem erweiterten Objekt verwendet werden.

Die folgenden Parameter sind additiv:

Im folgenden Beispiel enthält die Ansicht carriers die Dimension name mit dem Parameter 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"
    }
  }
}

Hier ist die Ansicht carriers_extended, die die Ansicht carriers erweitert. Die carriers_extended-Ansicht enthält außerdem die Dimension name mit unterschiedlichen Einstellungen im Parameter 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"
    }
  }
}

In der Ansicht carriers_extended sind die beiden link-Parameter additiv. Daher werden in der Dimension name beide Links angezeigt.

Zusätzliche Optionen mit Listen

Wenn Sie mit Listen arbeiten, können Sie diese kombinieren, anstatt die Liste des erweiterten Objekts zu gewinnen. Sehen Sie sich diese einfache Erweiterung mit einer in Konflikt stehenden Liste namens animals an:

view: pets {
  extends: fish
  set: animals {
    fields: [dog, cat]
  }
}
view: fish {
  set: animals {
    fields: [goldfish, guppy]
  }
}

In diesem Fall führt die Ansicht pets die Erweiterung durch und gewinnt daher, sodass animals den Wert [dog, cat] enthält. Mit dem speziellen Set EXTENDED* können Sie die Listen jedoch kombinieren:

view: pets {
  extends: fish
  set: animals {
    fields: [dog, cat, EXTENDED*]
  }
}
view: fish {
  set: animals {
    fields: [goldfish, guppy]
  }
}

Die Liste animals enthält jetzt [dog, cat, goldfish, guppy].

Kombinieren statt Ersetzen während der Konfliktlösung

Falls während der Erweiterung Konflikte auftreten, hat in den meisten Fällen das Erweiterungsobjekt Vorrang. Betrachten wir beispielsweise diese einfache Erweiterung:

view: product_short_descriptions {
  extends: products
  dimension: description {
    sql: ${TABLE}.short_description ;;
  }
}
view: products {
  dimension: description {
    sql: ${TABLE}.full_description ;;
  }
}

Wie Sie sehen, besteht ein Konflikt beim Parameter sql in der Dimension description. Normalerweise überschreibt die Definition von product_short_descriptions einfach die Definition von products, da sie die Erweiterung vornimmt.

Sie können die Definitionen aber auch kombinieren. Dazu verwenden Sie das Keyword ${EXTENDED} so:

view: product_short_descriptions {
  extends: products
  dimension: description {
    sql: LEFT(${EXTENDED}, 50) ;;
  }
}
view: products {
  dimension: description {
    sql: ${TABLE}.full_description ;;
  }
}

Jetzt wird der Konflikt des sql-Parameters anders behandelt. Anstelle der erfolgreichen product_short_descriptions-Definition wird die Definition aus products an der Stelle eingefügt, an der ${EXTENDED} verwendet wird. Die resultierende Definition für description lautet in diesem Fall LEFT(${TABLE}.full_description, 50).

Wichtige Punkte

Projekte mit Lokalisierung

Beachten Sie beim Erweitern eines Objekts, dass die Lokalisierungsregeln auch auf Ihre Erweiterungen angewendet werden. Wenn Sie ein Objekt erweitern und dann neue Labels oder Beschreibungen definieren, sollten Sie Lokalisierungsdefinitionen in den Gebietsschema-Zeichenfolgendateien Ihres Projekts angeben. Weitere Informationen finden Sie auf der Dokumentationsseite Ihr LookML-Modell lokalisieren.