Ce document explique comment exécuter des algorithmes sur Spanner Graph.
Structure des requêtes d'algorithme Spanner Graph
Une requête d'algorithme Spanner Graph présente la structure suivante :
EXPORT DATA OPTIONS (export_option_list) AS
GRAPH graph_name
match_clause
call_statement algorithm_name(common_input, algorithm_specific_input)
YIELD algorithm_specific_output
RETURN results
export_option_list: options qui définissent la manière de conserver les résultats des requêtes d'algorithme. Consultez les options Cloud Storage et les options Spanner.graph_name: nom du graphique.match_clause: instructions MATCH facultatives pour définir les éléments d'entrée de l'algorithme.call_statement: utilisez l'instructionCALLlorsque vous omettez la variablematch_clauseet que vous souhaitez opérer sur l'ensemble du graphique. Utilisez l'instructionCALL PER()lorsque la variablematch_clauseest présente et que vous souhaitez effectuer une opération sur la table de travail. Pour en savoir plus, consultez GQL CALL.algorithm_name: nom de l'algorithme à exécuter. Pour connaître les algorithmes disponibles, consultez Algorithmes Spanner Graph.common_input: paramètres d'entrée nommés communs à toutes les requêtes d'algorithme. Pour en savoir plus, consultez Paramètres d'entrée courants des algorithmes.algorithm_specific_input: paramètres d'entrée nommés pour l'algorithme. Pour en savoir plus, consultez les paramètres d'entrée définis dans Algorithmes Spanner Graph.algorithm_specific_output: résultat de l'appel de l'algorithme. Pour en savoir plus, consultez les sorties définies dans Algorithmes Spanner Graph et la clauseYIELDdans l'instruction CALL.results: définit ce qui doit être renvoyé dans les résultats de la requête.
La requête est composée d'une instruction EXPORT DATA, qui définit comment conserver les résultats, et d'une CLAUSE GRAPH qui produit le résultat de la requête de l'algorithme.
Dans sa forme la plus simple, la clause graph identifie le graphe, utilise une instruction CALL pour appeler un algorithme qui génère une sortie prédéfinie, puis utilise une instruction RETURN pour spécifier ce qu'il faut renvoyer à partir de la sortie de l'algorithme.
La clause de graphique peut éventuellement utiliser des instructions MATCH compatibles pour sélectionner les éléments qui vous intéressent. Dans ce cas, utilisez une clause PER () pour regrouper toutes les lignes renvoyées par l'instruction MATCH en tant qu'entrée de l'algorithme.
L'algorithme fonctionne sur un sous-graphe logique composé de l'ensemble unique de nœuds et d'arêtes sélectionnés.
La requête ne renvoie aucune donnée. La variable export_option_list détermine la manière dont les résultats sont conservés.
Pour en savoir plus sur les requêtes d'algorithme Spanner Graph, consultez les sections suivantes de ce document :
- Paramètres d'entrée d'algorithme courants
- Gérer la sortie de l'algorithme
- Exécuter des exemples de requêtes d'algorithme
Paramètres d'entrée d'algorithme courants
Spécifiez ces paramètres d'entrée nommés au format suivant : NAME => VALUE, ....
| Nom | Type de valeur | Obligatoire | Valeur par défaut | Description |
|---|---|---|---|---|
node_labels |
ARRAY |
Non | (aucun) | Uniquement compatible lorsque CALL est utilisé. Liste des libellés de nœuds à inclure dans l'entrée de l'algorithme. Si cette option est spécifiée, seuls les nœuds comportant au moins un libellé correspondant sont inclus.
|
edge_labels |
ARRAY |
Non | (aucun) | N'est compatible qu'avec CALL. Liste des libellés d'arêtes à inclure dans l'entrée de l'algorithme. Si ce paramètre est spécifié, seules les arêtes comportant au moins une étiquette correspondante sont incluses.
|
edge_weight_property |
STRING |
Non | (aucun) | Nom de la propriété d'arête contenant les pondérations. Si elle n'est pas définie, le système attribue une pondération par défaut de 1 à toutes les arêtes. La valeur de la propriété doit être de type numérique. |
machine_category |
STRING |
Non | par défaut | Catégorie de machine à utiliser pour l'exécution de l'algorithme. Valeurs acceptées : default, large |
fallback_compute_region |
STRING |
Non | (aucun) | Région de secours dans laquelle l'exécution de l'algorithme a lieu si la région d'origine est confrontée à des contraintes de capacité. Doit se trouver dans la même juridiction que la région d'origine de l'instance Spanner (par exemple, us-central1 si la région d'origine est us-east1). |
max_idle_time |
STRING |
Non | 30 min | Spécifie la durée pendant laquelle l'instance de calcul doit rester active pour être réutilisée une fois l'algorithme terminé. Le format est une séquence de nombres décimaux, chacun avec un suffixe d'unité, tel que 4m, 1.5h ou 1h45m. Les unités de temps valides sont ns, us (ou µs), ms, s, m et h. |
Gérer le résultat de l'algorithme
Vous devez conserver les résultats de la requête d'algorithme avant de pouvoir les inspecter. Utilisez export_data_option pour décrire comment conserver les résultats. Vous pouvez conserver les résultats dans Cloud Storage ou les renvoyer vers la même instance Spanner d'où provient la requête.
Conserver les résultats dans Cloud Storage
Pour utiliser cette option, assurez-vous que le rôle Administrateur des objets de l'espace de stockage (roles/storage.objectAdmin) est attribué au compte de service Spanner géré par Google service-PROJECT_NUMBER@gcp-sa-spanner.iam.gserviceaccount.com.
Les options EXPORT DATA suivantes sont compatibles lorsque vous conservez les résultats dans Cloud Storage. Spécifiez les options au format suivant : NAME=VALUE, ....
| Nom | Type de valeur | Obligatoire | Description |
|---|---|---|---|
uri |
STRING |
Oui | URI de destination pour l'exportation, au format gs://bucket/path/file. Si vous exportez une grande quantité de données, utilisez un caractère générique dans uri pour exporter les données dans plusieurs fichiers. Par exemple, gs://bucket/path/file_*.csv. |
format |
STRING |
Oui | Format des données exportées. Valeurs acceptées : CSV, PARQUET, AVRO. |
header |
BOOL |
Non | Si la valeur est true, le système imprime les en-têtes de colonne pour la première ligne de chaque fichier de données. La valeur par défaut est false. S'applique uniquement au format CSV. |
overwrite |
BOOL |
Non | Si true, le système écrase tous les fichiers existants portant le même URI. Sinon, si des fichiers portant le même URI existent, l'instruction renvoie une erreur. La valeur par défaut est false. |
field_delimiter |
STRING |
Non | Délimiteur qui sépare les champs. Par défaut : , (virgule). Ne s'applique qu'au format CSV. |
compression |
STRING |
Non | Spécifie le format de compression. Si vous ne spécifiez pas de format de compression, les fichiers ne sont pas compressés.
|
Les noms de colonnes de la clause RETURN définissent les noms de colonnes dans les fichiers de sortie Cloud Storage.
Exporter des données dans un ou plusieurs fichiers
Les requêtes Spanner Graph n'acceptent qu'un seul opérateur générique (*) dans uri. Le caractère générique peut apparaître dans le composant du nom de fichier, mais pas dans le nom du bucket, le nom du dossier ni l'extension de fichier. L'opérateur générique permet d'indiquer à Spanner Graph qu'il doit créer plusieurs fichiers segmentés en fonction du modèle que vous fournissez si l'ensemble de résultats est volumineux. Le système remplace l'opérateur générique par un numéro (en commençant à zéro) et il est complété à gauche de façon à obtenir 12 chiffres. Par exemple, un URI gs://my-bucket/file-*.csv crée des fichiers tels que gs://my-bucket/file-000000000000.csv, gs://my-bucket/file-000000000001.csv et d'autres fichiers similaires.
Si vous utilisez un uri sans caractère générique, le résultat est un seul fichier, tel que gs://my-bucket/file.csv.
Types de données
Lorsque vous exportez des données, les types de données graphiques Spanner sont convertis comme suit, selon le format :
CSV
Tous les types de données sont convertis en leur représentation sous forme de chaîne :
- Les valeurs
BOOLsont converties entrueoufalse. - Valeurs
BYTESencodées en base64. - Les valeurs
TIMESTAMPsont au formatYYYY-MM-DD HH:MM:SS.ffffff UTC. - Les valeurs
NULLs'affichent sous forme de chaînes vides.
Vous ne pouvez pas exporter des données imbriquées et répétées au format CSV.
Avro
| Type de données Spanner | Type de données Avro |
|---|---|
BOOL |
BOOLEAN |
INT64 |
LONG |
FLOAT |
FLOAT |
DOUBLE |
DOUBLE |
NUMERIC |
BYTES avec le type logique DECIMAL(38,9) |
STRING |
STRING |
BYTES |
BYTES |
TIMESTAMP |
LONG (microsecondes depuis l'epoch) |
NULL |
null |
Parquet
| Type de données Spanner | Type de données Parquet |
|---|---|
BOOL |
BOOLEAN |
INT64 |
INT64 |
FLOAT |
FLOAT |
DOUBLE |
DOUBLE |
NUMERIC |
DECIMAL(38,9) |
STRING |
STRING |
BYTES |
BYTE_ARRAY |
TIMESTAMP |
TIMESTAMP_MICROS |
NULL |
null |
Conserver les résultats dans Spanner
Les options EXPORT DATA suivantes sont compatibles lorsque vous conservez les résultats dans votre instance Spanner source. Spécifiez les options au format suivant : NAME=VALUE, ....
| Nom | Type de valeur | Obligatoire | Description |
|---|---|---|---|
format |
STRING |
Oui | Format des données exportées. doit être CLOUD_SPANNER |
table |
STRING |
Oui | Nom de la table Spanner de destination dans laquelle écrire les résultats. Il peut s'agir de n'importe quelle table de l'instance Spanner. |
write_mode |
STRING |
Oui | Mode d'écriture à utiliser. Les valeurs acceptées sont les suivantes :
Dans les deux modes, Spanner ignore tout enregistrement qui entraînerait une violation de contrainte (par exemple, des clés manquantes lors d'une mise à jour, une violation d'index unique ou une violation de contrainte de clé étrangère). Toutefois, l'écriture échoue pour les erreurs de non-respect des contraintes (par exemple, incompatibilité de type de colonne, valeurs manquantes pour les colonnes NOT NULL). |
Conditions requises
Lorsque vous conservez les résultats de l'algorithme dans Spanner, votre requête d'algorithme doit répondre aux exigences suivantes :
- La table de destination doit exister.
RETURNSi nécessaire, utilisez des alias pour faire correspondre les noms des colonnes de la table de destination. Exemple :RETURN node.id AS person_id.- Inclure toutes les colonnes de clé primaire : la clause
RETURNdoit inclure toutes les colonnes de clé primaire de la table de destination.
Sémantique d'écriture
La persistance des résultats dans Spanner est une opération non transactionnelle. Il fournit une atomicité au niveau des lignes. Cela signifie que le système écrit toutes les colonnes de la même ligne ou n'en écrit aucune. Il suit la sémantique de type "au moins une fois". Cela signifie qu'une ligne peut être écrite plusieurs fois. La lecture de la table de destination pendant l'exécution peut donner des résultats incomplets.
Si l'exécution globale échoue, le système n'annule pas les modifications qui ont déjà été validées. Le processus d'écriture échoue lors de la première erreur non réessayable. En cas d'échec d'écriture, le ERROR_MESSAGE dans GRAPH_OPERATION_EXECUTION_STATUS indique la clé primaire de la ligne qui a échoué, ainsi que la raison spécifique de l'échec.
Le système réécrit les résultats de l'algorithme dans Spanner Graph en utilisant la priorité MEDIUM.
Exécuter des exemples de requêtes d'algorithme
Cette section présente des exemples de requêtes d'algorithme Spanner Graph que vous pouvez exécuter sur une instance de test. Pour obtenir la liste complète des algorithmes compatibles avec Spanner Graph, consultez Algorithmes Spanner Graph.
Avant de commencer
Pour exécuter les exemples de requêtes d'algorithme Spanner Graph, vous devez d'abord effectuer les opérations suivantes :
- Suivez Configurer et interroger Spanner Graph pour créer un graphique Spanner.
- Assurez-vous de disposer des autorisations requises.
- Facultatif : Augmentez le schéma Spanner Graph si vous conservez la sortie dans Spanner.
Ajoutez une colonne nommée page_rank à la table Account. Spanner écrit les résultats de l'algorithme dans cette nouvelle colonne. Ensuite, actualisez la définition du graphique pour pouvoir accéder à page_rank en tant que propriété de nœud.
-- Add `page_rank` as a column. Data type of this column matches the data type defined in `PageRank` output signature.
ALTER TABLE Account ADD COLUMN page_rank FLOAT64;
-- Rerun the graph definition DDL to pickup `page_rank` as a new property.
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (`Account`, `Person`)
EDGE TABLES (
`PersonOwnAccount`
SOURCE KEY (id) REFERENCES `Person` (id)
DESTINATION KEY (account_id) REFERENCES `Account` (id)
LABEL `Owns`,
`AccountTransferAccount`
SOURCE KEY (id) REFERENCES `Account` (id)
DESTINATION KEY (to_id) REFERENCES `Account` (id)
LABEL `Transfers`
);
Exécuter un algorithme sur un graphique complet avec un filtre de libellé et conserver les résultats dans Cloud Storage
Cet exemple exécute l'instruction PageRank pour classer les comptes en fonction des transferts auxquels ils participent. Les résultats de la requête sont conservés dans un bucket Cloud Storage au format CSV sous le nom my-bucket-name/my-output.csv.
EXPORT DATA OPTIONS (
uri = "gs://my-bucket-name/my-output.csv",
format = "csv"
) AS
GRAPH FinGraph
CALL PageRank(node_labels => ['Account'], edge_labels => ['Transfers']) YIELD node, score
RETURN node.id, score AS page_rank
Dans Cloud Storage, un fichier CSV avec deux colonnes (id et page_rank) doit s'afficher une fois la requête exécutée.
Exécuter l'algorithme sur le sous-graphe défini par MATCH et conserver les résultats dans le graphique
Cet exemple utilise le modèle MATCH pour faire correspondre de manière dynamique un sous-graphe logique contenant tous les nœuds Account et uniquement les arêtes Transfer dont le montant est inférieur à 500.
Ce sous-graphe logique est l'entrée de l'algorithme PageRank.
Spanner conserve les résultats de l'algorithme dans la table Account.
EXPORT DATA OPTIONS (
format = "CLOUD_SPANNER",
table = "Account",
write_mode = 'update_ignore_all'
) AS
GRAPH FinGraph
MATCH (n:Account)
RETURN n
FULL UNION ALL
MATCH -[e:Transfers WHERE e.amount < 500]->
RETURN e
NEXT
CALL PER () PageRank() YIELD node, score
RETURN node.id, score AS page_rank
Une fois la requête exécutée, exécutez la requête suivante :
GRAPH FinGraph
MATCH (n:Account)
RETURN n.id, ROUND(n.page_rank, 2) AS page_rank
ORDER BY page_rank DESC, id ASC
Un résultat semblable aux lignes suivantes doit s'afficher :
| id | page_rank |
|---|---|
| 20 | 0,49 |
| 16 | 0,46 |
| 7 | 0,05 |
Vérifier l'état d'exécution de l'algorithme
Lorsqu'une requête d'algorithme de graphe aboutit, elle ne renvoie aucune ligne et l'état Success. Selon la taille du graphique d'entrée et les configurations spécifiques de l'algorithme, l'exécution de l'algorithme peut prendre un certain temps. Vous pouvez vérifier la progression et l'état d'exécution d'une requête d'algorithme de graphique dans le tableau SPANNER_SYS.GRAPH_OPERATION_EXECUTION_STATUS. Les informations de ce tableau sont conservées pendant 30 jours.
GRAPH_OPERATION_EXECUTION_STATUS schéma
| Nom de la colonne | Type | Description |
|---|---|---|
QUERY_ID |
STRING |
ID de la requête d'algorithme de graphe. |
QUERY_TEXT |
STRING |
Texte de l'instruction de requête. |
START_TIMESTAMP |
TIMESTAMP |
Heure à laquelle l'exécution de la requête a commencé. |
LAST_UPDATE_TIMESTAMP |
TIMESTAMP |
Heure de la dernière mise à jour de l'état. |
PROGRESS |
FLOAT64 |
Pourcentage de progression estimé. La valeur est comprise entre 0 et 1, où 0 signifie "démarré" et 1 signifie "terminé". |
STATUS |
STRING |
État actuel de l'exécution. Les valeurs possibles incluent PENDING, IN_PROGRESS, OK ou un code d'état d'erreur tel que CANCELLED, DEADLINE_EXCEEDED, INVALID_ARGUMENT, FAILED_PRECONDITION, RESOURCE_EXHAUSTED, UNAVAILABLE ou UNKNOWN. |
ERROR_MESSAGE |
STRING |
Message d'erreur si l'exécution de la requête a échoué. |
L'exemple de requête suivant liste les requêtes de graphe qui n'ont pas encore abouti :
SELECT
query_id,
query_text,
start_timestamp,
last_update_timestamp,
progress,
status,
error_message
FROM
SPANNER_SYS.GRAPH_OPERATION_EXECUTION_STATUS
WHERE
status != "OK"
ORDER BY
start_timestamp DESC;
Annuler l'exécution de l'algorithme
Pour annuler une requête d'algorithme de graphe en cours, recherchez l'query_id dans la table SPANNER_SYS.GRAPH_OPERATION_EXECUTION_STATUS, puis appelez cancel_query pour cet query_id.
Étapes suivantes
- Catalogue des algorithmes Spanner Graph
- Exigences de schéma et compatibilité des fonctionnalités de l'algorithme Spanner Graph.