Este documento explica como executar algoritmos no Spanner Graph.
Estrutura de consulta de algoritmo do Spanner Graph
Uma consulta de algoritmo do Spanner Graph tem a seguinte estrutura:
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: opções que definem como manter os resultados da consulta do algoritmo. Consulte as opções do Cloud Storage e as opções do Spanner.graph_name: o nome do gráfico.match_clause: instruções MATCH opcionais para definir elementos de entrada do algoritmo.call_statement: use a instruçãoCALLquando você omitir a variávelmatch_clausee quiser operar em todo o gráfico. Use a instruçãoCALL PER()quando a variávelmatch_clauseestiver presente e você quiser operar na tabela de trabalho. Para mais informações, consulte GQL CALL.algorithm_name: o nome do algoritmo a ser executado. Para conferir os algoritmos disponíveis, consulte Algoritmos do Spanner Graph.common_input: parâmetros de entrada nomeados comuns a todas as consultas de algoritmo. Para mais informações, consulte parâmetros de entrada de algoritmo comuns.algorithm_specific_input: parâmetros de entrada nomeados para o algoritmo. Para mais informações, consulte os parâmetros de entrada definidos em Algoritmos do Spanner Graph.algorithm_specific_output: a saída da chamada do algoritmo. Para mais informações, consulte as saídas definidas em Algoritmos do Spanner Graph e a cláusulaYIELDna instrução CALL.results: define o que retornar nos resultados da consulta.
A consulta é composta por uma instrução EXPORT DATA, que define como persistir os resultados, e uma CLÁUSULA GRAPH que produz o resultado da consulta do algoritmo.
Na forma mais simples, a cláusula graph identifica o gráfico, usa uma instrução CALL para invocar um algoritmo que gera uma saída predefinida e, em seguida, usa uma instrução RETURN para especificar o que retornar da saída do algoritmo.
Como opção, a cláusula de gráfico pode usar instruções
MATCH
compatíveis para selecionar elementos de interesse. Nesse caso, use uma cláusula PER ()
para agrupar todas as linhas retornadas pela instrução MATCH como entrada para o algoritmo.
O algoritmo opera em um subgráfico lógico composto pelo conjunto exclusivo de nós
e arestas selecionados.
A consulta não retorna dados. A variável export_option_list determina como os resultados são mantidos.
Para mais informações sobre consultas de algoritmo de grafo do Spanner, consulte as seguintes seções neste documento:
- Parâmetros de entrada comuns do algoritmo
- Processar a saída do algoritmo
- Executar consultas de exemplo de algoritmo
Parâmetros de entrada de algoritmo comuns
Especifique esses parâmetros de entrada nomeados no seguinte formato: NAME => VALUE, ....
| Nome | Tipo de valor | Obrigatório | Valor padrão | Descrição |
|---|---|---|---|---|
node_labels |
ARRAY |
Não | (nenhum) | Só é compatível quando CALL é usado. Uma lista de rótulos de nós a serem incluídos na entrada do algoritmo. Se especificado, somente os nós com pelo menos um rótulo correspondente serão incluídos.
|
edge_labels |
ARRAY |
Não | (nenhum) | Só é compatível quando CALL é usado. Uma lista de rótulos de borda para incluir na
entrada do algoritmo. Se especificado, somente as bordas com pelo menos um rótulo correspondente serão incluídas.
|
edge_weight_property |
STRING |
Não | (nenhum) | O nome da propriedade de aresta que contém os pesos. Se não for definido, o sistema vai atribuir um peso padrão de 1 a todas as arestas. O tipo de valor da propriedade precisa ser numérico. |
machine_category |
STRING |
Não | padrão | A categoria de máquina a ser usada para a execução do algoritmo. Valores compatíveis: default, large |
fallback_compute_region |
STRING |
Não | (nenhum) | A região de substituição em que a execução do algoritmo ocorre se a região de origem enfrentar restrições de capacidade. Precisa estar na mesma jurisdição que a região de origem da instância do Spanner (por exemplo, us-central1 se a região de origem for us-east1). |
max_idle_time |
STRING |
Não | 30min | Especifica por quanto tempo a instância de computação deve permanecer ativa para
reutilização após a conclusão do algoritmo. O formato é uma sequência de números decimais, cada um com um sufixo de unidade, como 4m, 1.5h ou 1h45m. As unidades de tempo válidas são ns,
us (ou µs), ms, s,
m, h. |
Processar a saída do algoritmo
É preciso persistir os resultados da consulta do algoritmo antes de inspecioná-los. Use o
export_data_option para descrever como manter os resultados. É possível manter os resultados no Cloud Storage ou na mesma instância do Spanner de onde a consulta foi originada.
Manter os resultados no Cloud Storage
Para usar essa opção, verifique se o papel Administrador de objetos do Storage (roles/storage.objectAdmin)
foi concedido à
conta de serviço do Spanner
service-PROJECT_NUMBER@gcp-sa-spanner. gerenciada pelo Google.
As seguintes opções de EXPORT DATA são compatíveis ao persistir resultados no Cloud Storage. Especifique as opções no seguinte formato: NAME=VALUE, ....
| Nome | Tipo de valor | Obrigatório | Descrição |
|---|---|---|---|
uri |
STRING |
Sim | O URI de destino da exportação, no formato gs://bucket/path/file. Se você exportar uma grande quantidade de dados, use um caractere curinga em uri para exportar dados para vários arquivos. Por exemplo, gs://bucket/path/file_*.csv. |
format |
STRING |
Sim | O formato dos dados exportados. Valores compatíveis: CSV, PARQUET, AVRO. |
header |
BOOL |
Não | Se true, o sistema vai imprimir os cabeçalhos de coluna da primeira linha de cada arquivo de dados. O padrão é false. Válido apenas para CSV. |
overwrite |
BOOL |
Não | Se for true, o sistema vai substituir os arquivos existentes pelo mesmo URI. Caso contrário, se houver arquivos com o mesmo URI, a instrução retornará um erro. O padrão é false. |
field_delimiter |
STRING |
Não | O delimitador que separa os campos. Padrão: , (vírgula). Válido apenas para CSV. |
compression |
STRING |
Não | Especifica o formato de compactação. Se você não especificar um formato de compactação, os arquivos vão permanecer descompactados.
|
Os nomes de coluna na cláusula RETURN definem os nomes de coluna nos arquivos de saída do Cloud Storage.
Exportar dados para um ou mais arquivos
As consultas do Spanner Graph aceitam um único operador curinga (*) no uri. O caractere curinga pode aparecer no componente do nome de arquivo, mas não no nome do bucket, no nome da pasta ou na extensão de arquivo. O uso do operador curinga instrui o Spanner Graph a criar vários arquivos fragmentados com base no padrão fornecido se o conjunto de resultados for grande. O sistema substitui o operador curinga por um número, começando em zero, com preenchimento à esquerda para 12 dígitos. Por exemplo, um URI gs://my-bucket/file-*.csv cria arquivos como
gs://my-bucket/file-000000000000.csv, gs://my-bucket/file-000000000001.csv e semelhantes.
Se você usar um uri sem caractere curinga, o resultado será um único arquivo, como
gs://my-bucket/file.csv.
Tipos de dados
Ao exportar dados, os tipos de dados do Spanner Graph são convertidos da seguinte maneira, dependendo do formato:
CSV
Todos os tipos de dados são convertidos para a representação de string:
- Os valores
BOOLsão convertidos emtrueoufalse. - Valores
BYTEScodificados em base64. - Os valores
TIMESTAMPsão formatados comoYYYY-MM-DD HH:MM:SS.ffffff UTC. - Os valores
NULLaparecem como strings vazias.
Não é possível exportar dados aninhados e repetidos no formato CSV.
Avro
| Tipo de dados do Spanner | Tipo de dados Avro |
|---|---|
BOOL |
BOOLEAN |
INT64 |
LONG |
FLOAT |
FLOAT |
DOUBLE |
DOUBLE |
NUMERIC |
BYTES com tipo lógico DECIMAL(38,9) |
STRING |
STRING |
BYTES |
BYTES |
TIMESTAMP |
LONG (microssegundos desde a Era Unix) |
NULL |
null |
Parquet
| Tipo de dados do Spanner | Tipo de dados do Parquet |
|---|---|
BOOL |
BOOLEAN |
INT64 |
INT64 |
FLOAT |
FLOAT |
DOUBLE |
DOUBLE |
NUMERIC |
DECIMAL(38,9) |
STRING |
STRING |
BYTES |
BYTE_ARRAY |
TIMESTAMP |
TIMESTAMP_MICROS |
NULL |
null |
Manter os resultados no Spanner
As seguintes opções de EXPORT DATA são compatíveis ao manter os resultados na instância de origem do Spanner. Especifique as opções no seguinte
formato: NAME=VALUE, ....
| Nome | Tipo de valor | Obrigatório | Descrição |
|---|---|---|---|
format |
STRING |
Sim | O formato dos dados exportados. Precisa ser CLOUD_SPANNER. |
table |
STRING |
Sim | O nome da tabela de destino do Spanner em que os resultados serão gravados. Pode ser qualquer tabela na instância do Spanner. |
write_mode |
STRING |
Sim | O modo de gravação a ser usado. Os valores compatíveis são:
Nos dois modos, o Spanner ignora qualquer registro que introduza uma violação de restrição (por exemplo, chaves ausentes em uma atualização, violação de índice exclusivo, violação de restrição de chave externa). No entanto, a gravação falha em erros de violação que não são de restrição (por exemplo, incompatibilidade de tipo de coluna, valores ausentes para colunas NOT NULL). |
Requisitos
Ao persistir os resultados do algoritmo no Spanner, a consulta do algoritmo precisa atender aos seguintes requisitos:
- A tabela de destino precisa existir.
- As colunas precisam existir com um tipo correspondente: todos os nomes de coluna especificados na cláusula
RETURNprecisam já existir na tabela de destino com um tipo de dados correspondente. Use aliases para corresponder aos nomes das colunas da tabela de destino, se necessário. Exemplo:RETURN node.id AS person_id. - Inclua todas as colunas de chave primária: a cláusula
RETURNprecisa incluir todas as colunas de chave primária da tabela de destino.
Semântica de gravação
A persistência de resultados no Spanner é uma operação não transacional. Ele fornece atomicidade no nível da linha. Isso significa que o sistema grava todas as colunas da mesma linha ou não grava nenhuma delas. Ele segue a semântica do tipo "pelo menos uma vez". Isso significa que uma linha pode ser gravada várias vezes. A leitura da tabela de destino durante a execução pode gerar resultados incompletos.
Se a execução geral falhar, o sistema não vai reverter as mudanças que já foram
confirmadas. O processo de gravação falha no primeiro erro não repetível. Quando ocorre uma falha de gravação, o ERROR_MESSAGE em
GRAPH_OPERATION_EXECUTION_STATUS
indica a chave primária da linha que falhou, junto com o motivo específico
da falha.
O sistema grava os resultados do algoritmo de volta no Spanner Graph usando a prioridade MEDIUM.
Executar consultas de algoritmo de exemplo
Nesta seção, mostramos exemplos de consultas de algoritmo do Spanner Graph que podem ser executadas em uma instância de teste. Para uma lista completa de algoritmos compatíveis com o Spanner Graph, consulte Algoritmos do Spanner Graph.
Antes de começar
Para executar as consultas de exemplo do algoritmo do Spanner Graph, primeiro conclua o seguinte:
- Siga as instruções em Configurar e consultar o Spanner Graph para criar um Spanner Graph.
- Verifique se você tem as permissões necessárias.
- Opcional: aumente o esquema do Spanner Graph se você estiver mantendo a saída no Spanner.
Adicione uma nova coluna chamada page_rank à tabela Account. O Spanner
grava os resultados do algoritmo nessa nova coluna. Em seguida, atualize a definição do gráfico
para acessar page_rank como uma propriedade de nó.
-- 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`
);
Executar o algoritmo no gráfico completo com filtro de rótulo e manter os resultados no Cloud Storage
Este exemplo executa a instrução PageRank para classificar as contas com base nas
transferências em que elas participam. Os resultados da consulta são mantidos em um
bucket do Cloud Storage no formato CSV como 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
No Cloud Storage, você verá um arquivo CSV com duas colunas (id e
page_rank) quando essa consulta for concluída.
Executar o algoritmo no subgráfico definido por MATCH e manter os resultados no gráfico
Este exemplo usa o padrão MATCH para corresponder dinamicamente a um subgrafo lógico
que contém todos os nós Account e apenas arestas Transfer com um valor menor que 500.
Esse subgrafo lógico é a entrada para o algoritmo PageRank.
O Spanner mantém os resultados do algoritmo na tabela 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
Depois que a consulta for concluída, execute esta consulta:
GRAPH FinGraph
MATCH (n:Account)
RETURN n.id, ROUND(n.page_rank, 2) AS page_rank
ORDER BY page_rank DESC, id ASC
Os resultados serão semelhantes aos exibidos abaixo:
| ID | page_rank |
|---|---|
| 20 | 0,49 |
| 16 | 0.46 |
| 7 | 0,05 |
Verificar o status de execução do algoritmo
Quando uma consulta de algoritmo de grafo é concluída, ela retorna zero linhas e o status Success. Dependendo do tamanho do gráfico de entrada e das configurações específicas do algoritmo, a execução do algoritmo pode levar algum tempo para ser concluída. É possível
verificar o progresso e o status de execução de uma consulta de algoritmo de gráfico na
tabela SPANNER_SYS.GRAPH_OPERATION_EXECUTION_STATUS. Essa tabela retém
informações por 30 dias.
GRAPH_OPERATION_EXECUTION_STATUS esquema
| Nome da coluna | Tipo | Descrição |
|---|---|---|
QUERY_ID |
STRING |
O ID da consulta do algoritmo de gráfico. |
QUERY_TEXT |
STRING |
O texto da instrução de consulta. |
START_TIMESTAMP |
TIMESTAMP |
O horário em que a consulta começou a ser executada. |
LAST_UPDATE_TIMESTAMP |
TIMESTAMP |
A hora em que o status foi atualizado pela última vez. |
PROGRESS |
FLOAT64 |
Porcentagem estimada de conclusão. O valor está entre 0 e 1, em que 0 significa "iniciado" e 1 significa "concluído". |
STATUS |
STRING |
Estado atual da execução. Os valores possíveis incluem PENDING, IN_PROGRESS, OK ou um código de status de erro, como CANCELLED, DEADLINE_EXCEEDED, INVALID_ARGUMENT, FAILED_PRECONDITION, RESOURCE_EXHAUSTED, UNAVAILABLE ou UNKNOWN. |
ERROR_MESSAGE |
STRING |
Mensagem de erro se a execução da consulta falhar. |
O exemplo de consulta a seguir lista as consultas de gráfico que ainda não foram concluídas:
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;
Cancelar execução do algoritmo
Para cancelar uma consulta de algoritmo de gráfico em andamento, localize o query_id na tabela SPANNER_SYS.GRAPH_OPERATION_EXECUTION_STATUS e chame cancel_query para esse query_id.