En esta página, se describe cómo trabajar con JSON usando Spanner.
El tipo de datos JSON es un tipo de datos semiestructurado que se usa para conservar datos JSON (notación de objetos de JavaScript). Las especificaciones del formato JSON se describen en RFC 7159.
JSON es útil para complementar un esquema relacional para datos dispersos, que tienen una estructura definida o que cambia de manera flexible. Sin embargo, el optimizador de consultas se basa en el modelo relacional para filtrar, unir, agregar y ordenar a gran escala de manera eficiente. Las consultas sobre JSON tendrán menos optimizaciones integradas y menos posibilidades de inspeccionar y ajustar el rendimiento.
Especificaciones
El tipo JSON de Spanner almacena una representación normalizada del documento JSON de entrada.
- JSON se puede anidar en un máximo de 80 niveles.
- El espacio en blanco no se conserva.
- No se admiten comentarios. Las transacciones o consultas con comentarios fallarán.
- Los miembros de un objeto JSON se ordenan de manera lexicográfica.
- Los elementos del arreglo JSON se conservan en su orden.
- Si un objeto JSON tiene claves duplicadas, solo se conserva la primera.
- Los tipos básicos (string, booleano, número y nulo) tienen su tipo y valor preservados.
- Los valores de tipo de string se conservan de forma exacta.
- Los valores de tipo numérico se conservan, pero su representación textual puede cambiar como resultado del proceso de normalización. Por ejemplo, un número de entrada de 10,000 puede tener una representación normalizada de 1e+4. La semántica de preservación del valor numérico es la siguiente:
- Se conservan los números enteros con signo en el rango de [INT64_MIN, INT64_MAX].
- Se conservan los números enteros sin signo en el rango de [0, UINT64_MAX].
- Se conservan los valores dobles que se pueden redondear de una string a otra con la string sin pérdida de precisión. Si un valor doble no puede viajar ida y vuelta de esta manera, la transacción o consulta falla.
- Por ejemplo,
SELECT JSON '2.2412421353246235436'
falla. - Una solución alternativa funcional es
PARSE_JSON('2.2412421353246235436', wide_number_mode=>'round')
, que muestraJSON '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 escape y de entrecomillado necesarios.
El tamaño máximo permitido del documento normalizado es de 10 MB.
Nulabilidad
Los valores null
de JSON se tratan como SQL que no es 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 se deben codificar en UTF-8. Las transacciones o consultas con documentos JSON codificados en otros formatos muestran un error.
Crea una tabla con columnas JSON
Se puede agregar una columna JSON a una tabla cuando esta se crea. 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);
Agregado y quitado de las columnas JSON de las tablas existentes
Una columna JSON también se puede agregar y descartar de las tablas existentes.
ALTER TABLE Venues ADD COLUMN VenueDetails JSON;
ALTER TABLE Venues DROP COLUMN VenueDetails;
En el siguiente ejemplo, se muestra cómo agregar una columna JSON
llamada VenueDetails
a la tabla Venues
con las bibliotecas cliente de Spanner.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Modifica datos de JSON
En el siguiente ejemplo, se muestra cómo actualizar los datos JSON
con las bibliotecas cliente de Spanner.
C++
Para obtener información sobre cómo instalar y usar la biblioteca cliente de Spanner, consulta las bibliotecas cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
C#
Para obtener información sobre cómo instalar y usar la biblioteca cliente de Spanner, consulta las bibliotecas cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
Go
Para obtener información sobre cómo instalar y usar la biblioteca cliente de Spanner, consulta las bibliotecas cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
Java
Para obtener información sobre cómo instalar y usar la biblioteca cliente de Spanner, consulta las bibliotecas cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
Node.js
Para obtener información sobre cómo instalar y usar la biblioteca cliente de Spanner, consulta las bibliotecas cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
PHP
Para obtener información sobre cómo instalar y usar la biblioteca cliente de Spanner, consulta las bibliotecas cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
Python
Para obtener información sobre cómo instalar y usar la biblioteca cliente de Spanner, consulta las bibliotecas cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
Ruby
Para obtener información sobre cómo instalar y usar la biblioteca cliente de Spanner, consulta las bibliotecas cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
Indexa datos JSON
Puedes acelerar las consultas de datos JSON con í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.
Usa un índice secundario
Los índices secundarios son útiles cuando se filtra según valores escalares dentro de un documento JSON. Para usar índices secundarios con JSON, crea una columna generada que extraiga los datos escalares pertinentes y convierta los datos a un tipo de SQL adecuado. Luego, puedes crear un índice secundario sobre esta columna generada. El índice acelera las consultas aptas que se ejecutan en la columna generada.
En el siguiente ejemplo, crearás un índice VenuesByCapacity
que la base de datos usará para encontrar los lugares con capacidades superiores a 1,000. En lugar de verificar cada fila, Spanner usa el índice para ubicar las filas pertinentes, lo que mejora el rendimiento de las consultas, en especial para las 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;
Usa índices de búsqueda
Los índices de búsqueda son útiles cuando realizas consultas en documentos JSON dinámicos o variados. A diferencia de los índices secundarios, puedes crear índices de búsqueda sobre cualquier documento JSON almacenado en una columna JSON. El índice de búsqueda se adapta automáticamente a las variaciones entre los documentos JSON, entre las diferentes filas y con el tiempo.
En el siguiente ejemplo, crearás un índice de búsqueda VenuesByVenueDetails
que la base de datos usará para encontrar los lugares con detalles específicos, como el tamaño y el horario de atención. En lugar de verificar cada fila, Spanner usa el índice para ubicar las filas pertinentes, lo que mejora el rendimiento de las consultas, en especial para las 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 de JSON.
Consulta datos JSON
En el siguiente ejemplo, se muestra cómo consultar los datos JSON
con las bibliotecas cliente de Spanner.
C++
Para obtener información sobre cómo instalar y usar la biblioteca cliente de Spanner, consulta las bibliotecas cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
C#
Para obtener información sobre cómo instalar y usar la biblioteca cliente de Spanner, consulta las bibliotecas cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
Go
Para obtener información sobre cómo instalar y usar la biblioteca cliente de Spanner, consulta las bibliotecas cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
Java
Para obtener información sobre cómo instalar y usar la biblioteca cliente de Spanner, consulta las bibliotecas cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
Node.js
Para obtener información sobre cómo instalar y usar la biblioteca cliente de Spanner, consulta las bibliotecas cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
PHP
Para obtener información sobre cómo instalar y usar la biblioteca cliente de Spanner, consulta las bibliotecas cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
Python
Para obtener información sobre cómo instalar y usar la biblioteca cliente de Spanner, consulta las bibliotecas cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
Ruby
Para obtener información sobre cómo instalar y usar la biblioteca cliente de Spanner, consulta las bibliotecas cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para 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 Indexa datos JSON.
¿Qué sigue?
- Tipo de datos JSON
- Funciones JSON
- Operadores de JSON: