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 comillas y escape 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 anularse.
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
mediante 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
mediante las bibliotecas cliente de Spanner.
C++
Para obtener información sobre cómo instalar y usar la biblioteca cliente de Spanner, consulta 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 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 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 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 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 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 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 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 el índice secundario
Los índices secundarios son útiles cuando se filtran valores escalares dentro de 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 apropiado. Luego, puedes crear un índice secundario en esta columna generada. El índice acelera las consultas aptas que se ejecutan en la columna generada.
En el siguiente ejemplo, creas un índice VenuesByCapacity
que la base de datos usa para encontrar los lugares con capacidades superiores a 1,000. En lugar de verificar cada fila, Spanner usa el índice para ubicar las filas relevantes, lo que mejora el rendimiento de las consultas, en especial para 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 consultas documentos JSON que son 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 entre los documentos JSON, entre diferentes filas y a lo largo del tiempo.
En el siguiente ejemplo, creas un índice de búsqueda VenuesByVenueDetails
que la base de datos usa 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 relevantes, lo que mejora el rendimiento de las consultas, en especial para 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
mediante las bibliotecas cliente de Spanner.
C++
Para obtener información sobre cómo instalar y usar la biblioteca cliente de Spanner, consulta 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 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 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 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 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 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 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 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 primarias ni como claves en índices secundarios. Para obtener más información, consulta Cómo indexar datos JSON.
¿Qué sigue?
- Tipo de datos JSON
- Funciones JSON
- Operadores JSON: