Este es un tema avanzado para el que se supone que el lector tiene un conocimiento sólido de LookML.
Descripción general
A medida que tu modelo de LookML se amplía en tamaño y complejidad, se vuelve cada vez más útil reutilizar LookML en varios lugares. El parámetro extends
te permite volver a usar el código, lo que te ayuda a hacer lo siguiente:
- Escribe código DRY (no te repitas), de modo que puedas definir elementos en un solo lugar, lo que hará que tu código sea más coherente y sea más rápido de editar.
- Administrar distintos conjuntos de campos para usuarios distintos
- Compartir patrones de diseño en diferentes partes de tu proyecto
- Reutilizar conjuntos de uniones, dimensiones o medidas en todo un proyecto
Para extender un objeto de LookML, crea un objeto nuevo de LookML y, luego, agrega el parámetro extends
para indicar que el objeto nuevo es una extensión de un objeto existente. Esto significa que tu proyecto tendrá dos versiones del objeto LookML. Si hay algún conflicto, el objeto extendido tendrá prioridad y anulará la configuración del objeto que se está extendiendo. Consulta la sección Detalles de implementación de extends
más adelante en esta página para obtener detalles.
Consulta las mejoras de LookML: Extender una vista o una exploración es ideal para situaciones en las que quieres tener varias versiones de ellas. Pero si tu objetivo es simplemente modificar una vista o una exploración sin editar el archivo de LookML que lo contiene, puedes usar un perfeccionamiento. También puedes usar un parámetro
extends
dentro de un perfeccionamiento. Consulta la página de documentación sobre las mejoras de Looker para obtener más información y casos de uso.
Puedes extender las vistas, las exploraciones y los paneles de LookML:
Los modelos no se pueden extender ni puedes incluir un archivo de modelo en otro archivo de modelo. En cambio, si deseas volver a usar o extender las exploraciones a través de modelos, puedes crear un archivo de exploración independiente y, luego, incluir ese archivo en un archivo de modelo.
Consulta los siguientes ejemplos para extender una exploración y extender un panel de LookML.
Cómo extender una exploración
Este es un ejemplo de cómo extender una exploración:
explore: customer {
persist_for: "12 hours"
}
explore: transaction {
extends: [customer]
persist_for: "5 minutes"
}
En este ejemplo, tenemos una exploración llamada Customer y creamos una segunda exploración llamada Transaction que la extiende. Todo lo que esté en Customer, como sus uniones, se incluirá en Transaction. Todo lo que esté en Transaction permanecerá en Transaction.
Sin embargo, ten en cuenta que hay un conflicto. La exploración de cliente indica que el parámetro de configuración persist_for
debería ser de 12 horas, pero la exploración de transacciones indica que debería ser de 5 minutos. Para la exploración de transacción, se usará el parámetro de configuración persist_for: "5 minutes"
, ya que reemplaza el parámetro de configuración de la exploración que se está extendiendo.
Amplía un panel de LookML
Para extender un panel de LookML, los paneles extendidos y extendidos deben incluirse en el archivo del modelo. Si un panel que usa el parámetro extends
se incluye en un archivo de modelo sin el panel base que extiende, aparecerá un error de validación de LookML que indicará que no se puede encontrar el panel base (entre otros errores).
Este es un ejemplo de archivo de panel:
Archivo: 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
Podemos crear un nuevo archivo de panel de LookML y ampliar el panel FAA agregando una nueva tarjeta:
Archivo: 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
Dado que extiende el panel de la FAA, el panel FAA Additional incluirá todos los mosaicos que se definan en el archivo faa.dashboard.lookml
. Además, el panel FAA Additional tendrá los mosaicos definidos en su propio archivo faa_additional.dashboard.lookml
.
La forma más fácil de crear un panel de LookML es obtener LookML desde un panel definido por el usuario. También puedes usar esta técnica con el objetivo de obtener LookML para mosaicos de paneles individuales. Si usas este método, asegúrate de que las posiciones de los mosaicos no se superpongan. En los ejemplos de faa.dashboard.lookml
y faa_additional.dashboard.lookml
, los mosaicos están en la fila superior del panel, que se indica con row: 0
:
Archivo: faa.dashboard.lookml
row: 0
col: 0
width: 8
height: 6
Sin embargo, el nuevo mosaico que agregaremos en el panel FAA Additional se encuentra en col: 8
, por lo que se mostrará junto al mosaico en el panel extendido:
Archivo: faa_additional.dashboard.lookml
row: 0
col: 8
width: 8
height: 6
Esto es fácil de pasar por alto, ya que estos elementos están en diferentes archivos de panel. Por lo tanto, si agregas mosaicos a un panel extendido, asegúrate de verificar que no haya conflictos de posicionamiento entre los mosaicos del panel extendido y los mosaicos del panel extendido.
Requiere extensión
Puedes usar el parámetro extension: required
para marcar un objeto de LookML como una extensión que requiere una extensión, lo que significa que el objeto no se puede usar por sí solo. Un objeto con extension: required
no es visible para los usuarios por sí solo; está diseñado únicamente como punto de partida para que otro objeto de LookML lo extienda. El parámetro extension
es compatible con las funciones Exploraciones, vistas y paneles de Looker.
No se puede usar un explore
con extension: required
como explore_source
para una prueba de datos. El Validador de Looker generará un error que indicará que no se puede encontrar el explore_source
.
Usa metadatos para ver las extensiones de un objeto
Puedes hacer clic en un parámetro explore
o view
en el IDE de Looker y usar el panel de metadatos para ver las extensiones del objeto o ver qué objeto extiende. Para obtener más información, consulta la página de documentación Metadatos de objetos de LookML.
Detalles de implementación de extends
Estos son los pasos que realiza Looker cuando extiende un objeto de LookML:
- Copiar el objeto que se extiende: Looker crea una copia de LookML para la vista, la exploración o el panel de LookML que se está extendiendo. Esta copia nueva es el objeto ing.
- Combina el LookML de las dos copias: Looker combina el LookML del objeto extendido al que se extiende .
- Resuelve los conflictos entre las copias: En general, si un elemento de LookML se define en el objeto extendido y en el objeto extendido, se usa la versión en el objeto extendido. Sin embargo, en otros casos, las extensiones combinarán los valores de los parámetros en lugar de anularlos. Consulta la sección Combinación de parámetros en esta página para obtener más información.
- Aplica el LookML: Una vez que se resuelven todos los conflictos, Looker interpreta el LookML resultante con la lógica estándar. En otras palabras, Looker usará todos los valores predeterminados y suposiciones estándar, como con cualquier otro panel de vista, exploración o LookML.
En las siguientes secciones, se muestran los detalles de estos pasos, con una vista de ejemplo. A continuación, se muestra LookML para nuestra vista base, la vista User:
view: user {
suggestions: yes
dimension: name {
sql: ${TABLE}.name ;;
}
dimension: status {
sql: ${TABLE}.status ;;
type: number
}
}
Este es el LookML para la vista Usuario con extensiones de edad, que extiende la vista Usuario:
include: "/views/user.view"
view: user_with_age_extensions {
extends: [user]
suggestions: no
dimension: age {
type: number
sql: ${TABLE}.age ;;
}
dimension: status {
type: string
}
}
Paso 1: Copia LookML
En este caso, la vista user
se extiende a la vista user_with_age_extensions
. Como user
es la vista que se extiende, se creará una copia de esta antes de combinarla. El hecho de que se haya creado una copia no es particularmente importante en este punto. Es importante conocer el hecho de que la vista user
original no se modifica y se puede usar con normalidad.
Paso 2: Combina las copias
El siguiente paso es que todos los elementos de LookML de la vista extendida (user
) se combinen en la vista expansible (user_with_age_extensions
). Es importante comprender la naturaleza de esta combinación, que solo es una combinación de objetos de LookML. En términos prácticos, esto significa que se combina cualquier LookML escrito explícitamente, pero los valores predeterminados de LookML que no anotaste no se fusionan. En cierto sentido, en realidad es solo el texto de LookML lo que se está armando, y nada de su significado.
Paso 3: Resuelve conflictos
El tercer paso consiste en resolver cualquier conflicto entre las vistas combinadas.
En general, si un elemento LookML se define en el objeto extendidoed y en el objeto ing, se usa la versión en el objeto que se extiende. Sin embargo, en otros casos, las extensiones combinarán los valores de los parámetros en lugar de anularlos. Consulta la sección Combinación de parámetros en esta página para obtener más información.
En el caso del ejemplo de user_with_age_extensions
, ninguno de los parámetros es aditivo y no se especifican opciones de lista ni palabras clave sql
especiales, por lo que los valores de los parámetros en la vista extendida anularán los valores de parámetros en la vista extendida:
- El nombre de la vista extendida (
user_with_age_extensions
) anula el nombre de la vista extendida (user
). - El valor extensivo para
suggestions: no
anula el valor extendido asuggestions: yes
. - La vista extendida tiene una dimensión denominada
age
, que no existe en la vista extendida (sin conflictos). - La vista extendida tiene una dimensión denominada
name
, que no existe en la vista extendida (sin conflictos). - El valor
type: string
de la dimensiónstatus
en la vista extendida anula el valortype: number
en la vista extendida. - La dimensión
status
tiene un parámetrosql
, que no existe en la vista extendida (sin conflicto).
El hecho de que los valores predeterminados de LookML aún no se consideren es importante, ya que no es recomendable cometer el error de pensar que se están resolviendo los conflictos entre los valores predeterminados. En realidad, solo se los ignora en este paso. Es por eso que debemos agregar de forma explícita parámetros adicionales cuando se extienden objetos:
- Cuando extiende una vista, agregamos los parámetros
sql_table_name
yinclude
. - Cuando extiendes una exploración, agregamos los parámetros
view_name
yview_label
.
En este ejemplo específico, no agregamos sql_table_name
a la vista Usuario, lo que causará algunos problemas en el siguiente paso.
Paso 4: Interpreta LookML como normal
En el paso final, el LookML resultante se interpreta como normal, incluidos todos los valores predeterminados. En este ejemplo en particular, la vista resultante LookML se interpretaría de la siguiente manera:
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
}
}
Observa que el LookML resultante incluye view: user_with_age_extensions
, pero no ningún parámetro sql_table_name
. Como resultado, Looker supondrá que el valor de sql_table_name
es igual al nombre de la vista.
El problema es que probablemente no haya una tabla en nuestra base de datos llamada user_with_age_extensions
. Es por eso que debemos agregar un parámetro sql_table_name
a cualquier vista que se extenderá. Si agregas view_name
y view_label
a las exploraciones que se extenderán, se evitan problemas similares.
Combina extensiones
Existen varias formas de aprovechar los objetos de LookML con las extensiones:
- Un objeto puede extender muchos otros objetos.
- Un objeto extensible puede extenderse a sí mismo.
- Las extensiones se pueden usar en mejoras (consulta la página de documentación Perfeccionamientos de LookerML para obtener más información).
Si quieres ver un ejemplo de un caso de uso avanzado y leer sugerencias para solucionar problemas, consulta la página de prácticas recomendadas para solucionar problemas con un caso de uso avanzado de
extends
.
Extender más de un objeto al mismo tiempo
Es posible extender más de un panel, vista o exploración al mismo tiempo. Por ejemplo:
explore: orders {
extends: [user_info, marketing_info]
}
# Also works for dashboards and views
El proceso de extensión funciona exactamente como se describe en el ejemplo de implementación, pero hay una regla adicional sobre cómo se resuelven los conflictos. Si hay conflicto entre los elementos de la lista del parámetro extends
, se da prioridad a los últimos elementos que se incluyeron en la lista. Por lo tanto, en el ejemplo anterior, si hubiera conflictos entre user_info
y marketing_info
, ganaría la exploración de marketing_info
.
Encadena múltiples extensiones
También puedes encadenar todos los extensiones que desees. Por ejemplo:
explore: orders {
extends: [user_info]
...
}
explore: user_info {
extends: [marketing_info]
...
}
Una vez más, el proceso de extensión funciona exactamente como se describe en el ejemplo de implementación, con una regla adicional sobre la resolución de conflictos. Si hay algún conflicto, se le da prioridad al último elemento de la cadena de extensiones. En este ejemplo:
orders
tendría prioridad sobreuser_info
ymarketing_info
.user_info
tendría prioridad sobremarketing_info
.
Combinación de parámetros
En general, si un elemento LookML se define en el objeto extendidoed y en el objeto ing, se usa la versión en el objeto que se extiende. Este fue el caso del ejemplo de implementación en esta página.
Sin embargo, en los siguientes casos, las extensiones combine los valores de los parámetros en lugar de anularlos:
- Para los parámetros additive
- Con la palabra clave de la lista
EXTENDED*
- Con la palabra clave
${EXTENDED}
para el parámetrosql
Algunos parámetros son de adición
En muchos casos, si el objeto extendido contiene el mismo parámetro que el objeto que se está extendiendo, los valores del objeto que se extienden anularán los valores de los parámetros del objeto extendido. Sin embargo, las extensiones pueden ser aditivas para algunos parámetros, lo que significa que los valores del objeto extendido se usan junto con los valores del objeto extendido.
Los siguientes parámetros son additivos:
Para las dimensiones y medidas:
Para los parámetros:
Para tablas derivadas:
En cuanto a las vistas:
Para exploraciones:
En el siguiente ejemplo, la vista carriers
tiene una dimensión name
con un parámetro 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"
}
}
}
Esta es la vista carriers_extended
, que extiende la vista carriers
. La vista carriers_extended
también tiene una dimensión name
con diferentes opciones de configuración en el parámetro 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"
}
}
}
En la vista carriers_extended
, los dos parámetros link
son aditivos, por lo que la dimensión name
mostrará ambos vínculos.
Opciones adicionales con listas
Cuando trabajas con listas, puedes optar por combinarlas en lugar de que la lista del objeto que se extiende sea la más adecuada. Considera esta extensión simple con una lista en conflicto llamada animals
:
view: pets {
extends: fish
set: animals {
fields: [dog, cat]
}
}
view: fish {
set: animals {
fields: [goldfish, guppy]
}
}
En este caso, la vista pets
hará la extensión y, por lo tanto, ganará, lo que hará que animals
contenga [dog, cat]
. Sin embargo, si usas el conjunto especial EXTENDED*
, puedes combinar las listas en su lugar:
view: pets {
extends: fish
set: animals {
fields: [dog, cat, EXTENDED*]
}
}
view: fish {
set: animals {
fields: [goldfish, guppy]
}
}
Ahora la lista animals
contendrá [dog, cat, goldfish, guppy]
.
Combinar en lugar de reemplazar durante la resolución de conflictos
En general, si hay conflictos durante la extensión, ganará el objeto que se extienda. Por ejemplo, tomemos esta extensión simple:
view: product_short_descriptions {
extends: products
dimension: description {
sql: ${TABLE}.short_description ;;
}
}
view: products {
dimension: description {
sql: ${TABLE}.full_description ;;
}
}
Puedes ver que hay un conflicto entre el parámetro sql
dentro de la dimensión description
. Por lo general, la definición de product_short_descriptions
simplemente reemplazará la definición de products
, porque está realizando la extensión.
Sin embargo, también puedes optar por combine las definiciones si lo deseas. Para hacerlo, usarás la palabra clave ${EXTENDED}
de la siguiente manera:
view: product_short_descriptions {
extends: products
dimension: description {
sql: LEFT(${EXTENDED}, 50) ;;
}
}
view: products {
dimension: description {
sql: ${TABLE}.full_description ;;
}
}
Ahora el conflicto del parámetro sql
se abordará de manera diferente. En lugar de la definición de product_short_descriptions
ganadora, se tomará la definición de products
y se insertará donde se use ${EXTENDED}
. La definición resultante de description
en este caso será: LEFT(${TABLE}.full_description, 50)
.
Aspectos para tener en cuenta
Proyectos con localización
Cuando extiendas un objeto, ten en cuenta que las reglas de localización también se aplican a tus extensiones. Si vas a extender un objeto y luego definirás etiquetas o descripciones nuevas, debes proporcionar definiciones de localización en los archivos de cadenas de configuración regional del proyecto. Consulta la página de documentación Cómo localizar tu modelo de LookML para obtener más información.