Ejemplos de consultas de GoogleSQL para Bigtable
En los ejemplos de esta página, se muestran patrones de consulta en SQL para consultas comunes y avanzadas de Bigtable. Puedes ejecutar consultas de GoogleSQL en el editor de consultas de Bigtable Studio. También puedes ejecutar consultas con la biblioteca cliente de Bigtable para Java.
Antes de leer esta página, consulta la descripción general de GoogleSQL para Bigtable.
En los ejemplos de esta página, se usan IDs y valores similares a los de Datos para los ejemplos.
Patrones comunes de consulta en SQL de Bigtable
Los siguientes son ejemplos de consultas comunes para los datos de Bigtable. Para ver ejemplos de consultas similares que llaman a la API de Bigtable Data, consulta Lee ejemplos y Usa filtros.
Recupera la versión más reciente de todas las columnas para una clave de fila determinada.
SELECT * FROM myTable WHERE _key = 'r1'
Recupera todas las versiones de todas las columnas para una clave de fila determinada.
SELECT * FROM myTable(with_history => TRUE) WHERE _key = 'r1'
Recupera la versión más reciente de una columna en particular de una familia de columnas para una clave de fila determinada.
SELECT stats_summary['os_build'] AS os
FROM analytics
WHERE _key = 'phone#4c410523#20190501'
Recupera las claves de fila y la versión más reciente de varias columnas para un rango de clave de fila determinado.
SELECT
_key,
stats_summary['os_build'] AS os,
stats_summary['user_agent'] AS agent
FROM analytics
WHERE _key >= 'phone#4c410523#20190501' AND _key < 'phone#4c410523#201906201'
Recupera todas las versiones de todas las columnas para varios rangos de clave de fila, hasta 10 filas.
SELECT *
FROM analytics(with_history => TRUE)
WHERE
(_key >= 'phone#4c410523#20190501' AND _key < 'phone#4c410523#201906201')
OR (_key >= 'phone#5c10102#20190501' AND _key < 'phone#5c10102#20190601')
LIMIT 10
Recupera todas las versiones de todas las columnas para varias claves de fila.
SELECT *
FROM analytics(with_history => TRUE)
WHERE _key = 'phone#4c410523#20190501' OR _key = 'phone#4c410523#20190502'
Recupera todas las versiones de todas las columnas para varias claves de fila con un enfoque diferente.
SELECT *
FROM analytics(with_history => TRUE)
WHERE _key IS IN ('phone#4c410523#20190501', 'phone#4c410523#20190502')
Recupera la versión más reciente de todas las columnas de una familia de columnas para un prefijo de clave de fila.
SELECT stats_summary
FROM analytics
WHERE _key LIKE 'phone#%'
Recupera las claves de fila y las tres versiones más recientes de todas las columnas dentro de una familia de columnas para todas las filas de la tabla. Esta consulta requiere un análisis completo de la tabla, por lo que no se recomienda para patrones de acceso de baja latencia y alta capacidad de procesamiento.
SELECT _key, cell_plan FROM analytics(with_history => TRUE, latest_n => 3)
Recupera la versión más reciente de todas las columnas con claves de fila que coincidan con una expresión regular especificada. Esta consulta requiere un análisis completo de la tabla, por lo que no se recomienda para patrones de acceso de baja latencia y alta productividad, a menos que también proporciones un prefijo de clave de fila o un predicado de rango de clave de fila en la cláusula WHERE
.
SELECT *
FROM myTable(with_history => TRUE)
WHERE REGEXP_CONTAINS(_key, '.*#20190501$')
Recupera la versión más reciente de todas las columnas con el prefijo de clave de fila coincidente y un valor de contador superior a 123
. No necesitas transmitir esta comparación, ya que los agrupamientos de Bigtable son numéricos.
SELECT *
FROM myTable
WHERE _key LIKE 'user12%' AND counterFamily['counter'] > 123
Recupera la versión más reciente de todas las columnas para un prefijo de clave de fila si el referente coincide con un valor específico.
SELECT *
FROM analytics
WHERE _key LIKE 'com.mysite%' AND session['referrer'] = './home'
Clasifica una fila determinada según el valor de una columna determinada. Esta consulta es similar al uso de un filtro condicional de composición en la API de Bigtable Data.
SELECT
*,
CASE cell_plan['data_plan']
WHEN '10gb' THEN 'passed-filter'
ELSE 'filtered-out'
END
AS label
FROM analytics
Recupera la clave de fila y los calificadores de columna en una familia de columnas específica para un rango de clave de fila especificado. En SQL, las familias de columnas se representan con el tipo de datos de mapa, en el que cada calificador y valor de columna se asigna como un par clave-valor. Esta consulta en SQL es similar al uso de un filtro de valor de eliminación en la API de Bigtable Data.
SELECT _key, MAP_KEYS(cell_plan) AS keys
FROM analytics
WHERE _key >= 'phone#4c410523#20190501' AND _key < 'phone#4c410523#201906201'
Patrones de consulta en SQL avanzados de Bigtable
En los siguientes ejemplos, se muestran patrones más avanzados.
Con la siguiente consulta, puedes recuperar la clave de fila y el valor más reciente del atributo JSON abc
en la familia de columnas session
. Para obtener más información, consulta las funciones JSON
.
SELECT _key, JSON_VALUE(session['payload'], '$.abc') AS abc FROM analytics
Con la siguiente consulta, puedes recuperar la clave de fila y calcular la duración promedio de la sesión con el valor más reciente de dos células agregadas de Bigtable, que son numéricas, para cada fila de la tabla.
SELECT
_key AS userid,
session['total_minutes'] / session['count'] AS avg_session_length
FROM analytics
Con la siguiente consulta, puedes recuperar la versión más reciente de todas las columnas para un prefijo de clave de fila determinado si la familia de columnas session
contiene referrer
, origin
o server
como calificador de columna. Como alternativa, esta consulta también se puede escribir como una serie de comparaciones individuales, como session['referrer']
IS NOT NULL OR session['origin'] IS NOT NULL
. Sin embargo, para las consultas que involucran una gran cantidad de comparaciones, se recomienda el siguiente enfoque.
SELECT *
FROM analytics
WHERE
_key LIKE 'com.abc%'
AND ARRAY_INCLUDES_ANY(MAP_KEYS(session), ['referrer', 'origin', 'server'])
Con la siguiente consulta, puedes recuperar la versión más reciente de todas las columnas para un prefijo de clave de fila determinado si la familia de columnas session
contiene referrer
, origin
y server
como calificadores de columna. Como alternativa, esta consulta se puede escribir como una serie de comparaciones individuales, como session['referrer'] IS
NOT NULL AND session ['origin'] IS NOT NULL
.
SELECT *
FROM analytics
WHERE
_key LIKE 'com.abc%'
AND ARRAY_INCLUDES_ALL(MAP_KEYS(session), ['referrer', 'origin', 'server'])
Con la siguiente consulta, puedes recuperar la versión más reciente de todas las columnas para un prefijo de clave de fila determinado si la familia de columnas session
contiene com.google.search
, com.google.maps
o com.google.shopping
como valores.
SELECT *
FROM analytics
WHERE
_key LIKE 'com.abc%'
AND ARRAY_INCLUDES_ANY(
MAP_VALUES(session),
['com.google.search', 'com.google.maps', 'com.google.shopping'])
Con la siguiente consulta, puedes recuperar la versión más reciente de todas las columnas si los pares clave-valor de la familia de columnas cell_plan
incluyen data_plan:unlimited
y roaming:North America
.
SELECT *
FROM analytics
WHERE
ARRAY_INCLUDES_ALL(
CAST(
MAP_ENTRIES(cell_plan)
AS ARRAY<STRUCT<key STRING, value STRING>>),
[('data_plan', 'unlimited'), ('roaming', 'North America')])
Con la siguiente consulta, puedes recuperar las lecturas de row key
y temperature
de los sensores meteorológicos para los casos en que la temperatura superó los 70 grados durante las últimas siete mediciones.
SELECT
_key AS sensorid,
ARRAY_FILTER(
CAST(
sensor['temperature']
AS ARRAY<STRUCT<timestamp TIMESTAMP, value STRING>>),
e -> CAST(e.value AS FLOAT32) > 70) AS high_temperature
FROM weather(with_history => TRUE, latest_n => 7)
En el orden de filtrado temporal, latest_n
aparece en último lugar, por lo que una consulta como after => X,
before => y, latest_n => 3
muestra los tres valores más recientes que satisfacen las condiciones después y antes. Si tu caso de uso requiere que latest_n
tenga prioridad, puedes proporcionar latest_n
como el único filtro temporal y, luego, aplicar el resto de los filtros temporales con operadores de consulta en tu sentencia SELECT
, como se muestra en el ejemplo. Para obtener más información, consulta Filtros temporales.
SELECT
ARRAY_FILTER(
CAST(
address['street']
AS ARRAY<STRUCT<timestamp TIMESTAMP, value STRING>>),
e -> e.timestamp > TIMESTAMP('2021-01-04 23:51:00+00'))
AS street_address
FROM locations(with_history => TRUE, latest_n => 3)
Al igual que en el ejemplo anterior, puedes aplicar un filtro temporal diferente a cada familia de columnas en tu consulta. Por ejemplo, la siguiente consulta muestra las
tres versiones más recientes de la columna street
y las dos versiones menos recientes de la columna state
.
SELECT
ARRAY_FILTER(
CAST(
address['street']
AS ARRAY<STRUCT<timestamp TIMESTAMP, value STRING>>),
(e, i) -> i <= 2)
AS street_address,
ARRAY_FILTER(
ARRAY_REVERSE(
CAST(
address['state']
AS ARRAY<STRUCT<timestamp TIMESTAMP, value STRING>>)),
(e, i) -> i <= 1)
AS state
FROM locations(with_history => TRUE)
Con la siguiente consulta, puedes recuperar todas las versiones de todas las columnas si los pares clave-valor de la familia de columnas de dirección incluyen city:Savannah
o city:Nashville
en cualquier momento.
SELECT *
FROM locations(with_history => TRUE)
WHERE
ARRAY_LENGTH(
ARRAY_FILTER(
CAST(
MAP_ENTRIES(address)
AS ARRAY<
STRUCT<
key STRING,
value ARRAY<STRUCT<timestamp TIMESTAMP, value STRING>>>>),
e ->
e.key = 'city'
AND ARRAY_INCLUDES_ANY(
ARRAY_TRANSFORM(e.value, k -> k.value), ['Savannah', 'Nashville'])))
> 0
En este ejemplo en particular, no se requiere el casting, por lo que también se puede escribir en la siguiente forma más corta.
SELECT *
FROM locations(with_history => TRUE)
WHERE
ARRAY_LENGTH(
ARRAY_FILTER(
MAP_ENTRIES(address),
e ->
e.key = 'city'
AND ARRAY_INCLUDES_ANY(
ARRAY_TRANSFORM(e.value, k -> k.value), ['Savannah', 'Nashville'])))
> 0
¿Qué sigue?
- Explora la documentación de referencia de GoogleSQL para Bigtable.
- Usa el conector de Bigtable Spark.