Si tienes experiencia en SQL y comienzas a usar Looker, probablemente te interese saber cómo genera SQL Looker. Básicamente, Looker es una herramienta que genera consultas en SQL y las envía a una conexión de base de datos. Looker formula consultas en SQL basadas en un proyecto de LookML que describe la relación entre las tablas y las columnas de la base de datos. Si comprendes cómo Looker genera consultas, entenderás mejor cómo tu código de LookML se traduce en consultas de SQL eficientes.
Cada parámetro de LookML controla algún aspecto de cómo Looker genera SQL, ya que altera la estructura, el contenido o el comportamiento de la consulta. En esta página, se describen los principios de cómo Looker genera SQL, pero no se abarcan todos los elementos de LookML en detalle. La página de documentación de referencia rápida de LookML es un buen lugar para comenzar a obtener información sobre los parámetros de LookML.
Cómo ver la consulta
En una Vista guardada o en una Exploración, puedes usar la pestaña SQL en el panel Datos para ver lo que Looker envía a la base de datos para obtener los datos. También puedes usar los vínculos Abrir en el Ejecutor de SQL y Explicar en el Ejecutor de SQL que se encuentran en la parte inferior de la pestaña SQL para ver tu consulta en el Ejecutor de SQL o para ver el plan de explicación de la base de datos para la consulta.
Para obtener más información sobre SQL Runner, consulta la página de documentación Conceptos básicos de SQL Runner. Para obtener más información sobre cómo optimizar una consulta con SQL Runner, consulta la publicación de Comunidad Cómo optimizar SQL con EXPLAIN.
Forma canónica de una consulta de Looker
Las consultas en SQL de Looker siempre tienen el siguiente formato.
SELECT
<dimension>, <dimension>, ...
<measure>, <measure>, ...
FROM <explore>
LEFT JOIN <view> ON ...
LEFT JOIN <view> ON ...
WHERE (<dimension_filter_expression>) AND (<dimension_filter_expression>) AND ...
GROUP BY <dimension>, <dimension>, <dimension>, ...
HAVING <measure_filter_expression> AND <measure_filter_expression> AND ...
ORDER BY <dimension> | <measure>
LIMIT <limit>
El proyecto de LookML define todas las dimensiones, las medidas, las exploraciones y las vistas a las que se hace referencia en la consulta en SQL. El usuario especifica las expresiones de filtro en Looker para dar forma a las consultas ad hoc. Las expresiones de filtro también se pueden declarar directamente en LookML para aplicarse a todas las consultas.
Componentes fundamentales de una consulta de Looker
Todas las consultas de Looker se representan con estos parámetros fundamentales aplicados a un proyecto de LookML, como se ve en la consulta del ejemplo anterior.
Looker usa los siguientes parámetros para generar una consulta en SQL completa:
model
: Es el nombre del modelo de LookML al que se segmenta, que especifica la base de datos de destino.explore
: Es el nombre de la función Explore que se consultará y que completa la cláusulaFROM
de SQL.- Campos: Los parámetros
dimension
ymeasure
que se incluirán en la consulta y que completan la cláusulaSELECT
de SQL filter
: Expresiones de filtro de Looker para aplicar a cero o más campos, que completan las cláusulasWHERE
yHAVING
de SQL- Orden: El campo por el que se ordenará y el orden, que completa la cláusula
ORDER BY
de SQL
Estos parámetros son precisamente los elementos que un usuario especifica cuando crea una consulta en la página Explorar de Looker. Estos mismos elementos aparecen en todos los modos de ejecución de consultas con Looker, como en el código SQL generado, en la URL que representa la consulta y en la API de Looker.
¿Qué sucede con las vistas especificadas por las cláusulas LEFT JOIN
? Las cláusulas JOIN
se completan según la estructura del modelo de LookML, que especifica cómo se unen las vistas a los Explorar. Cuando se crean consultas en SQL, Looker incluye cláusulas JOIN
solo cuando es necesario. Cuando los usuarios crean una consulta en Looker, no tienen que especificar cómo se unen las tablas, ya que esta información está codificada en el modelo, uno de los beneficios más poderosos de Looker para los usuarios empresariales.
Un ejemplo de consulta y el código SQL resultante
Creemos una consulta en Looker para demostrar cómo se genera la consulta según el patrón anterior. Considera una tienda de comercio electrónico que tiene una base de datos con dos tablas, pedidos y usuarios, para hacer un seguimiento de los usuarios y los pedidos.
orders |
---|
id INT |
created_at DATETIME |
users_id INT |
status VARCHAR(255) |
traffic_source VARCHAR(15) |
users |
---|
id INT |
email VARCHAR(255) |
first_name VARCHAR(255) |
last_name VARCHAR(255) |
created_at DATETIME |
zip INT |
country VARCHAR(255) |
state VARCHAR(255) |
city VARCHAR(255) |
age INT |
traffic_source VARCHAR(15) |
Busquemos la cantidad de pedidos (ORDERS Count) agrupados por estado (USERS State) y filtrados por la fecha de creación del pedido (ORDERS Created Date) en un Explorador de Looker.
Para ver la consulta en SQL que genera y ejecuta Looker, haz clic en la pestaña SQL del panel Datos.
SELECT COALESCE(users.state, ' ') AS "_g1",
users.state AS 'users.state',
COUNT(DISTINCT orders.id) AS 'orders.count'
FROM orders
LEFT JOIN users ON orders.user_id = users.id
WHERE
orders.created_at BETWEEN (CONVERT_TZ(DATE_ADD(CURDATE(), INTERVAL -29 day), 'America/Los_Angeles', 'UTC',)) AND (CONVERT_TZ(DATE_ADD(DATE_ADD(DATE_ADD(CURDATE(), INTERVAL -29 day), INTERVAL 30 day), INTERVAL -1 second), 'America/Los_Angeles', 'UTC'))
GROUP BY 1
ORDER BY COUNT(DISTINCT orders.id) DESC
LIMIT 500
Ten en cuenta la similitud con la fórmula de consulta canónica. El SQL de Looker exhibe algunos rasgos de código generado por máquina (por ejemplo, COALESCE(users.state,'') AS "_g1"
), pero siempre se ajusta a la fórmula.
Experimenta con más consultas en Looker para comprobar que la estructura de la consulta siempre es la misma.
Ejecuta SQL sin procesar en el Ejecutor de SQL de Looker
Looker incluye una función llamada SQL Runner, en la que puedes ejecutar cualquier código SQL que desees en las conexiones de bases de datos que configuraste en Looker.
Dado que cada consulta que genera Looker da como resultado un comando SQL completo y funcional, puedes usar SQL Runner para investigar o experimentar con la consulta.
Las consultas en SQL sin procesar que se ejecutan en SQL Runner producen el mismo conjunto de resultados. Si el código SQL contiene errores, SQL Runner destacará la ubicación del primer error en el comando SQL y mostrará la posición del error en el mensaje de error.
Cómo examinar los componentes de la búsqueda en la URL expandida
Después de ejecutar una consulta en Looker, puedes examinar la URL expandida para ver los componentes fundamentales de una consulta de Looker. Para comenzar, selecciona Compartir en el menú de ajustes de Explorar para abrir el menú Compartir URLs.
La URL expandida proporciona información suficiente para recrear la búsqueda. Por ejemplo, esta URL expandida proporciona la siguiente información:
https://<Looker instance URL>.cloud.looker.com/explore/e_thelook/events?fields=users.state,users.count
&f[users.created_year]=2020&sorts=users.count+desc&limit=500
modelo | e_thelook |
exploración | events |
campos para consultar y mostrar | fields=users.state,users.count |
Campo y orden de clasificación | sorts=users.count+desc |
Campos y valores de filtro | f[users.created_year]=2020 |
Cómo Looker estructura las UNIONES
En la consulta del ejemplo anterior, observa que el Explorar orders
aparece en la cláusula FROM
principal y las vistas unidas aparecen en las cláusulas LEFT JOIN
. Las uniones de Looker se pueden escribir de muchas maneras diferentes, lo que se explica con más detalle en la página Trabajar con uniones en LookML.
Los bloques de SQL especifican cláusulas de SQL personalizadas
No todos los elementos de una consulta de Looker se generan de forma automática. En algún momento, el modelo de datos debe proporcionar detalles específicos para que Looker pueda acceder a las tablas subyacentes y calcular los valores derivados. En LookML, los bloques de SQL son fragmentos de código SQL proporcionados por el modelador de datos que Looker usa para sintetizar expresiones de SQL completas.
El parámetro de bloque de SQL más común es sql
, que se usa en las definiciones de dimensiones y medidas. El parámetro sql
especifica una cláusula SQL para hacer referencia a una columna subyacente o realizar una función de agregado. En general, todos los parámetros de LookML que comienzan con sql_
esperan una expresión SQL de alguna forma. Por ejemplo, sql_always_where
, sql_on
y sql_table_name
. Consulta la Referencia de LookML para obtener más información sobre cada parámetro.
Ejemplos de bloques de SQL para dimensiones y medidas
En la siguiente muestra de código, se proporcionan algunos ejemplos de bloques SQL para dimensiones y métricas. El operador de sustitución de LookML ($) hace que estas declaraciones de sql
parezcan engañosamente diferentes de SQL. Sin embargo, después de la sustitución, la cadena resultante es SQL puro, que Looker inserta en la cláusula SELECT
de la consulta.
dimension: id {
primary_key: yes
sql: ${TABLE}.id ;; # Specify the primary key, id
}
measure: average_cost {
type: average
value_format: "0.00"
sql: ${cost} ;; # Specify the field that you want to average
# The field 'cost' is declared elsewhere
}
dimension: name {
sql: CONCAT(${first_name}, ' ', ${last_name}) ;;
}
dimension: days_in_inventory {
type: number
sql: DATEDIFF(${sold_date}, ${created_date}) ;;
}
Como se muestra en las últimas dos dimensiones de este ejemplo, los bloques de SQL pueden usar funciones compatibles con la base de datos subyacente (como las funciones CONCAT
y DATEDIFF
de MySQL en este caso). El código que usas en los bloques de SQL debe coincidir con el dialecto de SQL que usa la base de datos.
Ejemplo de bloque SQL para tablas derivadas
Las tablas derivadas también usan un bloque SQL para especificar la consulta que deriva la tabla. Este es un ejemplo de una tabla derivada basada en SQL:
view: user_order_facts {
derived_table: {
sql:
SELECT
user_id
, COUNT(*) as lifetime_orders
FROM orders
GROUP BY 1 ;;
}
# later, dimension declarations reference the derived column(s)…
dimension: lifetime_orders {
type: number
}
}
Ejemplo de bloque SQL para filtrar un Explorar
Los parámetros de LookML sql_always_where
y sql_always_having
te permiten restringir los datos disponibles para una consulta insertando un bloque SQL en las cláusulas SQL WHERE o HAVING. En este ejemplo, el operador de sustitución de LookML ${view_name.SQL_TABLE_NAME}
se usa para hacer referencia a una tabla derivada:
explore: trips {
view_label: "Long Trips"
# This will ensure that we only see trips that are longer than average!
sql_always_where: ${trips.trip_duration}>=(SELECT tripduration FROM ${average_trip_duration.SQL_TABLE_NAME});;
}