En esta página se describe cómo trabajar con JSON mediante Spanner.
El tipo de datos JSON es un tipo de datos semiestructurado que se usa para contener datos JSON (JavaScript Object Notation). Las especificaciones del formato JSON se describen en RFC 7159.
JSON es útil para complementar un esquema relacional de datos dispersos o que tienen una estructura poco definida o cambiante. Sin embargo, el optimizador de consultas se basa en el modelo relacional para filtrar, unir, agregar y ordenar de forma eficiente a gran escala. Las consultas sobre JSON tendrán menos optimizaciones integradas y menos opciones para inspeccionar y ajustar el rendimiento.
Especificaciones
El tipo JSON de Spanner almacena una representación normalizada del documento JSON de entrada.
- El formato JSON se puede anidar hasta un máximo de 80 niveles.
- Los espacios no se conservan.
- No se admiten comentarios. Las transacciones o consultas con comentarios fallarán.
- Los miembros de un objeto JSON se ordenan lexicográficamente.
- Los elementos de la matriz JSON conservan su orden.
- Si un objeto JSON tiene claves duplicadas, solo se conserva la primera.
- Los tipos primitivos (cadena, booleano, número y nulo) conservan su tipo y su valor.
- Los valores de tipo String se conservan exactamente.
- Los valores de tipo número se conservan, pero puede que su representación textual cambie como resultado del proceso de normalización. Por ejemplo, el número de entrada 10000 puede tener una representación normalizada de 1e+4. La semántica de conservación de valores numéricos es la siguiente:
- Los números enteros con signo del intervalo [INT64_MIN, INT64_MAX] se conservan.
- Los números enteros sin signo del intervalo [0, UINT64_MAX] se conservan.
- Se conservan los valores dobles que se pueden convertir de cadena a doble y de doble a cadena sin perder precisión. Si un valor doble no se puede
redondear de esta forma, la transacción o la consulta fallarán.
- Por ejemplo,
SELECT JSON '2.2412421353246235436'
falla. - Una solución alternativa funcional es
PARSE_JSON('2.2412421353246235436', wide_number_mode=>'round')
, que devuelveJSON '2.2412421353246237'
.
- Por ejemplo,
- Usa las funciones
TO_JSON()
,JSON_OBJECT()
yJSON_ARRAY()
para crear documentos JSON en SQL. Estas funciones implementan los caracteres de comillas y de escape necesarios.
El tamaño máximo permitido del documento normalizado es de 10 MB.
Nulabilidad
Los valores JSON null
se tratan como valores SQL no NULL.
Por ejemplo:
SELECT (JSON '{"a":null}').a IS NULL; -- Returns FALSE
SELECT (JSON '{"a":null}').b IS NULL; -- Returns TRUE
SELECT JSON_QUERY(JSON '{"a":null}', "$.a"); -- Returns a JSON 'null'
SELECT JSON_QUERY(JSON '{"a":null}', "$.b"); -- Returns a SQL NULL
Codificación
Los documentos JSON deben codificarse en UTF-8. Las transacciones o consultas con documentos JSON codificados en otros formatos devuelven un error.
Crear una tabla con columnas JSON
Se puede añadir una columna JSON a una tabla cuando se crea la tabla. Los valores de tipo JSON pueden ser nulos.
CREATE TABLE Venues (
VenueId INT64 NOT NULL,
VenueName STRING(1024),
VenueAddress STRING(1024),
VenueFeatures JSON,
DateOpened DATE,
) PRIMARY KEY(VenueId);
Añadir y quitar columnas JSON de tablas
También se puede añadir y eliminar una columna JSON de tablas que ya existan.
ALTER TABLE Venues ADD COLUMN VenueDetails JSON;
ALTER TABLE Venues DROP COLUMN VenueDetails;
En el siguiente ejemplo se muestra cómo añadir una columna JSON
llamada VenueDetails
a la tabla Venues
mediante las bibliotecas de cliente de Spanner.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Modificar datos JSON
En el siguiente ejemplo se muestra cómo actualizar los datos de JSON
con las bibliotecas de cliente de Spanner.
C++
Para saber cómo instalar y usar la biblioteca de cliente de Spanner, consulta Bibliotecas de cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
C#
Para saber cómo instalar y usar la biblioteca de cliente de Spanner, consulta Bibliotecas de cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Go
Para saber cómo instalar y usar la biblioteca de cliente de Spanner, consulta Bibliotecas de cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Java
Para saber cómo instalar y usar la biblioteca de cliente de Spanner, consulta Bibliotecas de cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Node.js
Para saber cómo instalar y usar la biblioteca de cliente de Spanner, consulta Bibliotecas de cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
PHP
Para saber cómo instalar y usar la biblioteca de cliente de Spanner, consulta Bibliotecas de cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Python
Para saber cómo instalar y usar la biblioteca de cliente de Spanner, consulta Bibliotecas de cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Ruby
Para saber cómo instalar y usar la biblioteca de cliente de Spanner, consulta Bibliotecas de cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Indexar datos JSON
Puedes acelerar las consultas de datos JSON usando índices secundarios y índices de búsqueda con tus datos JSON. Spanner no admite el uso de columnas de tipo JSON como claves en índices secundarios.
Usar índice secundario
Los índices secundarios son útiles cuando se filtran valores escalares en un documento JSON. Para usar índices secundarios con JSON, crea una columna generada que extraiga los datos escalares relevantes y convierta los datos a un tipo de SQL adecuado. Después, puedes crear un índice secundario en esta columna generada. El índice acelera las consultas aptas que se ejecutan en la columna generada.
En el ejemplo siguiente, se crea un índice VenuesByCapacity
que la base de datos usa para buscar los locales con una capacidad superior a 1000. En lugar de comprobar cada fila, Spanner usa el índice para localizar las filas pertinentes, lo que mejora el rendimiento de las consultas, especialmente en tablas grandes.
ALTER TABLE Venues
ADD COLUMN VenueCapacity INT64 AS (INT64(VenueDetails.capacity));
CREATE INDEX VenuesByCapacity ON Venue (VenueCapacity);
SELECT VenueName
FROM Venues
WHERE VenueCapacity > 1000;
Usar índices de búsqueda
Los índices de búsqueda son útiles cuando haces consultas en documentos JSON dinámicos o variados. A diferencia de los índices secundarios, puedes crear índices de búsqueda en cualquier documento JSON almacenado en una columna JSON. El índice de búsqueda se adapta automáticamente a las variaciones de los documentos JSON, entre las distintas filas y a lo largo del tiempo.
En el siguiente ejemplo, se crea un VenuesByVenueDetails
índice de búsqueda que la base de datos usa para encontrar los locales con detalles específicos, como el tamaño y el horario de apertura. En lugar de comprobar cada fila, Spanner usa el índice para localizar las filas relevantes, lo que mejora el rendimiento de las consultas, especialmente en tablas grandes.
ALTER TABLE Venues
ADD COLUMN VenueDetails_Tokens TOKENLIST AS (TOKENIZE_JSON(VenueDetails)) HIDDEN;
CREATE SEARCH INDEX VenuesByVenueDetails
ON Venue (VenueDetails_Tokens);
SELECT VenueName
FROM Venues
WHERE JSON_CONTAINS(VenueDetails, JSON '{"labels": ["large"], "open": {"Friday": true}}');
Para obtener más información, consulta Índices de búsqueda JSON.
Consultar datos JSON
En el siguiente ejemplo se muestra cómo consultar datos de JSON
mediante las bibliotecas de cliente de Spanner.
C++
Para saber cómo instalar y usar la biblioteca de cliente de Spanner, consulta Bibliotecas de cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
C#
Para saber cómo instalar y usar la biblioteca de cliente de Spanner, consulta Bibliotecas de cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Go
Para saber cómo instalar y usar la biblioteca de cliente de Spanner, consulta Bibliotecas de cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Java
Para saber cómo instalar y usar la biblioteca de cliente de Spanner, consulta Bibliotecas de cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Node.js
Para saber cómo instalar y usar la biblioteca de cliente de Spanner, consulta Bibliotecas de cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
PHP
Para saber cómo instalar y usar la biblioteca de cliente de Spanner, consulta Bibliotecas de cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Python
Para saber cómo instalar y usar la biblioteca de cliente de Spanner, consulta Bibliotecas de cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Ruby
Para saber cómo instalar y usar la biblioteca de cliente de Spanner, consulta Bibliotecas de cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Restricciones
- No puedes usar columnas JSON en una cláusula
ORDER BY
. - No puedes usar columnas de tipo JSON como claves principales ni como claves en índices secundarios. Para obtener más información, consulta Indexar datos JSON.
Siguientes pasos
- Tipo de datos JSON
- Funciones JSON
- Operadores JSON: