Cette page explique comment utiliser JSON avec Spanner.
Le type de données JSON est un type de données semi-structuré utilisé pour stocker des données JSON (JavaScript Object Notation). Les spécifications du format JSON sont décrites dans le document RFC 7159.
Le format JSON est utile pour compléter un schéma relationnel pour des données éparses ou ayant une structure faiblement définie ou changeante. Cependant, l'optimiseur de requête s'appuie sur le modèle relationnel pour filtrer, joindre, agréger et trier efficacement à grande échelle. Les requêtes sur les objets JSON ont moins d'optimisations intégrées et de possibilités d'inspection et d'ajustement des performances.
Spécifications
Le type JSON de Spanner stocke une représentation normalisée du document JSON d'entrée.
- Le JSON peut être imbriqué avec un maximum de 80 niveaux.
- Les espaces ne sont pas conservés.
- Les commentaires ne sont pas acceptés. Les transactions ou les requêtes comportant des commentaires échoueront.
- Les membres d'un objet JSON sont triés de façon lexicographique.
- L'ordre des éléments de tableau JSON est conservé.
- Si un objet JSON possède des clés en double, seule la première est conservée.
- Le type et la valeur des types primitifs (chaîne, booléen, nombre et valeur nulle) sont conservés.
- Les valeurs de type de chaîne sont conservées exactement.
- Les valeurs de type numérique sont conservées mais leur représentation textuelle peut être modifiée à la suite du processus de normalisation. Par exemple, un nombre d'entrée de 10 000 peut avoir une représentation normalisée de 1e+4. La sémantique de conservation de valeur numérique est la suivante :
- Les entiers signés compris dans la plage [INT64_MIN, INT64_MAX] sont conservés.
- Les entiers non signés compris dans la plage [0, UINT64_MAX] sont conservés.
- Les valeurs de type "Double" pouvant être converties en chaîne puis reconverties en "Double" sans perte de précision sont conservées. Si une valeur "Double" ne peut pas être convertie de cette manière, la transaction ou la requête échoue.
- Par exemple,
SELECT JSON '2.2412421353246235436'
échoue. PARSE_JSON('2.2412421353246235436', wide_number_mode=>'round')
est une solution de contournement fonctionnelle qui renvoieJSON '2.2412421353246237'
.
- Par exemple,
- Utilisez les fonctions
TO_JSON()
,JSON_OBJECT()
etJSON_ARRAY()
pour créer des documents JSON en langage SQL. Ces fonctions implémentent les caractères de guillemets et d'échappement nécessaires.
La taille maximale autorisée du document normalisé est de 10 Mo.
Nullability
Les valeurs JSON null
sont traitées comme des valeurs SQL non nulles.
Exemple :
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
Encodage
Les documents JSON doivent être encodés au format UTF-8. Les transactions ou les requêtes avec des documents JSON encodés dans d'autres formats renvoient une erreur.
Créer une table avec des colonnes JSON
Vous pouvez ajouter une colonne JSON à une table lors de sa création. Les valeurs de type JSON peuvent être nullables.
CREATE TABLE Venues (
VenueId INT64 NOT NULL,
VenueName STRING(1024),
VenueAddress STRING(1024),
VenueFeatures JSON,
DateOpened DATE,
) PRIMARY KEY(VenueId);
Ajouter et supprimer des colonnes JSON dans des tables existantes
Une colonne JSON peut également être ajoutée ou supprimée des tables existantes.
ALTER TABLE Venues ADD COLUMN VenueDetails JSON;
ALTER TABLE Venues DROP COLUMN VenueDetails;
L'exemple suivant montre comment ajouter une colonne JSON
appelée VenueDetails
à la table Venues
en utilisant les bibliothèques clientes Spanner.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Modifier des données JSON
L'exemple suivant montre comment mettre à jour des données JSON
à l'aide des bibliothèques clientes Spanner.
C++
Pour savoir comment installer et utiliser la bibliothèque cliente pour Spanner, consultez la page Bibliothèques clientes Spanner.
Pour vous authentifier auprès de Spanner, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
C#
Pour savoir comment installer et utiliser la bibliothèque cliente pour Spanner, consultez la page Bibliothèques clientes Spanner.
Pour vous authentifier auprès de Spanner, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Go
Pour savoir comment installer et utiliser la bibliothèque cliente pour Spanner, consultez la page Bibliothèques clientes Spanner.
Pour vous authentifier auprès de Spanner, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Java
Pour savoir comment installer et utiliser la bibliothèque cliente pour Spanner, consultez la page Bibliothèques clientes Spanner.
Pour vous authentifier auprès de Spanner, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Node.js
Pour savoir comment installer et utiliser la bibliothèque cliente pour Spanner, consultez la page Bibliothèques clientes Spanner.
Pour vous authentifier auprès de Spanner, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
PHP
Pour savoir comment installer et utiliser la bibliothèque cliente pour Spanner, consultez la page Bibliothèques clientes Spanner.
Pour vous authentifier auprès de Spanner, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Python
Pour savoir comment installer et utiliser la bibliothèque cliente pour Spanner, consultez la page Bibliothèques clientes Spanner.
Pour vous authentifier auprès de Spanner, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Ruby
Pour savoir comment installer et utiliser la bibliothèque cliente pour Spanner, consultez la page Bibliothèques clientes Spanner.
Pour vous authentifier auprès de Spanner, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Indexer des données JSON
Vous pouvez accélérer l'interrogation des données JSON en utilisant des index secondaires et des index de recherche avec vos données JSON. Spanner n'accepte pas l'utilisation de colonnes de type JSON comme clés dans les index secondaires.
Utiliser un index secondaire
Les index secondaires sont utiles pour filtrer les valeurs scalaires dans un document JSON. Pour utiliser des index secondaires avec JSON, créez une colonne générée qui extrait les données scalaires pertinentes et convertit les données en un type SQL approprié. Vous pouvez ensuite créer un index secondaire sur cette colonne générée. L'index accélère les requêtes éligibles exécutées sur la colonne générée.
Dans l'exemple suivant, vous allez créer un index VenuesByCapacity
que la base de données utilise pour trouver les lieux dont la capacité est supérieure à 1 000. Au lieu de vérifier chaque ligne, Spanner utilise l'index pour localiser les lignes pertinentes, ce qui améliore les performances des requêtes, en particulier pour les grandes tables.
ALTER TABLE Venues
ADD COLUMN VenueCapacity INT64 AS (INT64(VenueDetails.capacity));
CREATE INDEX VenuesByCapacity ON Venue (VenueCapacity);
SELECT VenueName
FROM Venues
WHERE VenueCapacity > 1000;
Utiliser les index de recherche
Les index de recherche sont utiles lorsque vous interrogez des documents JSON dynamiques ou variés. Contrairement aux index secondaires, vous pouvez créer des index de recherche sur n'importe quel document JSON stocké dans une colonne JSON. L'index de recherche s'adapte automatiquement aux variations entre les documents JSON, entre les différentes lignes et au fil du temps.
Dans l'exemple suivant, vous créez un index de recherche VenuesByVenueDetails
que la base de données utilise pour trouver les lieux avec des détails spécifiques tels que la taille et les horaires d'ouverture. Au lieu de vérifier chaque ligne, Spanner utilise l'index pour localiser les lignes pertinentes, ce qui améliore les performances des requêtes, en particulier pour les grandes tables.
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}}');
Pour en savoir plus, consultez Index de recherche JSON.
Interroger des données JSON
L'exemple suivant montre comment interroger des données JSON
à l'aide des bibliothèques clientes Spanner.
C++
Pour savoir comment installer et utiliser la bibliothèque cliente pour Spanner, consultez la page Bibliothèques clientes Spanner.
Pour vous authentifier auprès de Spanner, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
C#
Pour savoir comment installer et utiliser la bibliothèque cliente pour Spanner, consultez la page Bibliothèques clientes Spanner.
Pour vous authentifier auprès de Spanner, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Go
Pour savoir comment installer et utiliser la bibliothèque cliente pour Spanner, consultez la page Bibliothèques clientes Spanner.
Pour vous authentifier auprès de Spanner, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Java
Pour savoir comment installer et utiliser la bibliothèque cliente pour Spanner, consultez la page Bibliothèques clientes Spanner.
Pour vous authentifier auprès de Spanner, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Node.js
Pour savoir comment installer et utiliser la bibliothèque cliente pour Spanner, consultez la page Bibliothèques clientes Spanner.
Pour vous authentifier auprès de Spanner, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
PHP
Pour savoir comment installer et utiliser la bibliothèque cliente pour Spanner, consultez la page Bibliothèques clientes Spanner.
Pour vous authentifier auprès de Spanner, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Python
Pour savoir comment installer et utiliser la bibliothèque cliente pour Spanner, consultez la page Bibliothèques clientes Spanner.
Pour vous authentifier auprès de Spanner, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Ruby
Pour savoir comment installer et utiliser la bibliothèque cliente pour Spanner, consultez la page Bibliothèques clientes Spanner.
Pour vous authentifier auprès de Spanner, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Restrictions
- Vous ne pouvez pas utiliser de colonnes JSON dans une clause
ORDER BY
. - Vous ne pouvez pas utiliser les colonnes de type JSON comme clés primaires ni comme clés dans les index secondaires. Pour en savoir plus, consultez Indexer des données JSON.
Étapes suivantes
- Type de données JSON
- Fonctions JSON
- Opérateurs JSON :