Trabalhar com valores ObjectRef
Este documento descreve os valores ObjectRef e como criá-los e usá-los no BigQuery.
Um valor ObjectRef é um STRUCT tipo
com um esquema predefinido que faz referência a objetos do Cloud Storage para
análise multimodal. Ele pode ser processado por funções OBJ, funções de IA ou funções definidas pelo usuário em Python.
Esquema
Um valor ObjectRef tem os seguintes campos:
| Nome | Tipo | Modo | Descrição | Exemplo |
|---|---|---|---|---|
uri |
STRING |
REQUIRED |
O URI do objeto do Cloud Storage. | "gs://cloud-samples-data/vision/demo-img.jpg" |
version |
STRING |
NULLABLE |
A geração de objetos. | "1560286006357632" |
authorizer |
STRING |
NULLABLE |
Um ID de conexão do BigQuery para acesso delegado ou NULL para acesso direto.
O ID pode ter os seguintes formatos: "region.connection"ou "project.region.connection" |
"myproject.us.myconnection" |
details |
JSON |
NULLABLE |
Os metadados do objeto ou erros no processamento dele. Ele pode incluir os
campos content_type, md5_hash, size e
updated para o objeto.
|
{"gcs_metadata":{"content_type":"image/png","md5_hash":"dfbbb5cf034af026d89f2dc16930be15","size":915052,"updated":1560286006000000}} |
O campo content_type no campo gcs_metadata da coluna details
é buscado do Cloud Storage. É possível definir o tipo de conteúdo de um objeto no Cloud Storage. Se você omitir esse campo no Cloud Storage, o BigQuery vai inferir o tipo de conteúdo pelo sufixo do URI.
Criar valores ObjectRef
É possível criar valores ObjectRef usando tabelas de objetos, a função OBJ.MAKE_REF ou conjuntos de dados do Cloud Storage Insights.
Usar tabelas de objetos
Use uma tabela de objetos se você não tiver URIs armazenados em uma tabela e quiser listar todos os objetos de um prefixo do Cloud Storage. Uma tabela de objetos armazena a referência a um objeto em cada linha e tem uma coluna ref que contém valores ObjectRef. A consulta a seguir usa a
instrução CREATE EXTERNAL TABLE
para criar uma tabela de objetos:
CREATE EXTERNAL TABLE mydataset.images
WITH CONNECTION `us.myconnection`
OPTIONS (uris=["gs://mybucket/images/*"], object_metadata="SIMPLE");
SELECT ref AS image_ref FROM mydataset.images;
Os valores ObjectRef de uma tabela de objetos precisam ter um autorizador para acesso delegado. A conexão do autorizador é a mesma
que você usa para criar a tabela de objetos.
Usar a função OBJ.MAKE_REF
Use a função OBJ.MAKE_REF
se você já tiver URIs armazenados em uma tabela e quiser criar
valores ObjectRef com base nesses URIs. As consultas a seguir mostram como criar valores ObjectRef na coluna image_ref da coluna uri que contém URIs do Cloud Storage:
-- Specify only the URI
SELECT *, OBJ.MAKE_REF(uri) AS image_ref FROM mydataset.images;
-- Specify the URI and the connection
SELECT *, OBJ.MAKE_REF(uri, "us.myconnection") AS image_ref FROM mydataset.images;
Para modificar os autorizadores de um valor ObjectRef, use a função OBJ.MAKE_REF:
-- Remove the authorizer
SELECT *, OBJ.MAKE_REF(ref, authorizer=>NULL) AS image_ref FROM mydataset.images;
-- Change the authorizer
SELECT *, OBJ.MAKE_REF(ref, authorizer=>"us.myconnection2") AS image_ref FROM mydataset.images;
A função OBJ.MAKE_REF aceita um autorizador anulável para oferecer suporte a
acesso direto e acesso delegado.
Usar conjuntos de dados do Cloud Storage Insights
Se você tiver um conjunto de dados do Storage Insights configurado, ele já vai incluir uma coluna ref que contém valores ObjectRef. Os valores ObjectRef criados em conjuntos de dados do Storage Insights não têm um autorizador. Para consultar esses objetos, você precisa ter acesso direto a eles ou adicionar um autorizador ao ObjectRef para usar o acesso delegado.
Autorizador e permissões
Quando você transmite um valor ObjectRef para funções ObjectRef, funções de IA ou UDFs do Python, essas funções precisam acessar o objeto armazenado no Cloud Storage. É possível autorizar esse acesso com base no valor do campo authorizer de duas maneiras: acesso direto e acesso delegado.
Acesso direto
Com o acesso direto, o usuário que executa a consulta acessa o objeto diretamente
usando as próprias credenciais. O acesso direto é usado quando o valor ObjectRef não tem autorizador.
O acesso direto tem as seguintes restrições:
- O usuário precisa ter permissão para acessar os objetos.
- Um job de consulta que usa as funções
AI.GENERATE,AI.IF,AI.SCOREouAI.CLASSIFYsem uma conexão exige que o usuário tenha permissões adicionais. A consulta só pode acessar buckets e objetos do Cloud Storage do mesmo projeto em que o job é executado.
Por exemplo, se você chamar a função AI.GENERATE em um valor ObjectRef
que não tem um autorizador, a função vai ler o objeto como você. Se você
não tiver permissão para ler o objeto, a função vai gravar um erro
"permission denied" na coluna status do resultado.
O exemplo a seguir mostra uma consulta que usa acesso direto:
-- Requires that the end user can read the object "gs://cloud-samples-data/vision/demo-img.jpg" and use the Vertex AI model.
SELECT AI.GENERATE(
("Describe this image:",
OBJ.GET_ACCESS_URL(OBJ.MAKE_REF("gs://cloud-samples-data/vision/demo-img.jpg"), 'r')));
Acesso delegado
Com o acesso delegado, o usuário que executa a consulta delega o acesso a objetos a uma conexão a recursos do BigQuery Cloud, especificada no campo authorizer do valor ObjectRef.
O acesso delegado pode permitir o acesso aos dados entre projetos.
Para usar o acesso delegado, o administrador de dados precisa seguir estas etapas para configurar a conexão e as permissões:
- Configuração única. O administrador de dados precisa configurar uma conexão a recursos do Cloud para gerenciar o bucket do Cloud Storage:
- Crie uma nova conexão a recursos do Cloud do BigQuery ou reutilize uma conexão existente no projeto.
- Procure a conta de serviço nos metadados da conexão.
- Conceda à conta de serviço a permissão
storage.objects.getpara leituras ou a permissãostorage.objects.createpara gravações no projeto ou nos buckets do Cloud Storage. Você pode conceder essas permissões com os papéis Leitor de objetos do Storage ou Usuário de objetos do Storage.
- Configuração por usuário. O administrador de dados precisa conceder aos usuários a permissão
bigquery.objectRefs.readpara leituras ou a permissãobigquery.objectRefs.writepara gravações na conexão do BigQuery. Você pode conceder essas permissões com os papéis de Leitor de ObjectRef do BigQuery ou Administrador de ObjectRef do BigQuery.
Por exemplo, se um usuário transmitir valores ObjectRef que têm um autorizador para uma
função AI.GENERATE, a função vai verificar se o usuário tem a
permissão bigquery.objectRefs.read e ler os objetos usando a
conta de serviço da conexão. Se o usuário ou a conta de serviço não tiver permissões suficientes, a função vai gravar um erro "permission denied" na coluna status do resultado.
O exemplo a seguir mostra uma consulta que usa acesso delegado. Ela requer o seguinte:
- O usuário tem a permissão
bigquery.objectRefs.reademconnection1. - A conta de serviço de
connection1tem a permissãostorage.objects.getno objeto. - A conta de serviço do
connection2tem o papel de usuário da Vertex AI.
SELECT AI.GENERATE(
("Describe this image:",
OBJ.GET_ACCESS_RUL(OBJ.MAKE_REF("gs://cloud-samples-data/vision/demo-img.jpg", "us.connection1"), 'r')),
connection_id => "us.connection2");
Práticas recomendadas
Considere as práticas recomendadas a seguir ao decidir se vai usar o acesso direto ou delegado:
- Use o acesso direto para uma equipe pequena que opera em um único projeto para armazenamento e análise de dados. O administrador de dados usa o Identity and Access Management para conceder aos usuários acesso aos dados do BigQuery e do Cloud Storage. Os usuários podem criar valores
ObjectRefsob demanda sem um autorizador para analisar objetos usando as próprias credenciais. - Use o acesso delegado para uma equipe grande que opera em vários projetos, principalmente quando o armazenamento e a análise de dados estão separados. O administrador de dados pode configurar conexões e criar valores de
ObjectRefpara análise com antecedência usando uma conexão como autorizador. Essa abordagem funciona com tabelas de objetos ou usandoOBJ.MAKE_REFem uma lista de URIs. Em seguida, o administrador de dados pode compartilhar com os analistas a tabela que armazena os valores deObjectRef. Os analistas não precisam acessar o bucket original para analisar os objetos.
Erros
As funções que consomem valores ObjectRef informam erros de duas maneiras:
- Falha na consulta: a consulta pode falhar com uma mensagem de erro e nenhum resultado.
- Valores de erro retornados: a consulta é bem-sucedida, mas a função pode gravar erros como parte do valor de retorno. Para informações sobre o formato do valor de retorno, consulte a página de referência da função que você está usando.
Quando uma função retorna um valor ObjectRef, o campo details desse valor pode conter um campo errors. Se houver, o valor desse campo será uma matriz de erros. Cada erro tem o seguinte esquema:
| Nome | Tipo | Modo | Descrição | Exemplo |
|---|---|---|---|---|
code |
INT64 |
REQUIRED |
Código de erro HTTP padrão. | 400 |
message |
STRING |
REQUIRED |
Uma mensagem de erro descritiva e fácil de entender. | "Connection credential for myproject.us.nonexistent_connection cannot be used. Either the connection does not exist, or the user does not have sufficient permissions (bigquery.objectRefs.read)" |
source |
STRING |
REQUIRED |
O nome da função que acionou o erro. | "OBJ.MAKE_REF" |
Estes são dois tipos comuns de erros:
- Erro de objeto: o URI ou a versão do objeto fornecida não existe.
- Erro do autorizador: a conexão não existe ou o usuário não tem permissão para usá-la no acesso delegado.
SELECT ref
FROM mydataset.images
WHERE ref.details.errors IS NOT NULL;
A seguir
- Especificar colunas
ObjectRefem esquemas de tabelas. - Analise dados multimodais.
- Saiba mais sobre as funções ObjectRef.