Trabaja con valores de ObjectRef
En este documento, se describen los valores ObjectRef y cómo crearlos y usarlos en BigQuery.
Un valor ObjectRef es un tipo STRUCT
con un esquema predefinido que hace referencia a objetos de Cloud Storage para
el análisis multimodal. Las funciones OBJlas funciones de IA o las funciones definidas por el usuario de Python pueden procesarlo.
Esquema
Un valor ObjectRef tiene los siguientes campos:
| Nombre | Tipo | Modo | Descripción | Ejemplo |
|---|---|---|---|---|
uri |
STRING |
REQUIRED |
Es el URI del objeto de Cloud Storage. | "gs://cloud-samples-data/vision/demo-img.jpg" |
version |
STRING |
NULLABLE |
Es la generación del objeto. | "1560286006357632" |
authorizer |
STRING |
NULLABLE |
Es un ID de conexión de BigQuery para el acceso delegado o NULL para el acceso directo.
El ID puede tener los siguientes formatos: "region.connection"o "project.region.connection" |
"myproject.us.myconnection" |
details |
JSON |
NULLABLE |
Son los metadatos del objeto o los errores del procesamiento del objeto. Puede incluir los
campos content_type, md5_hash, size y
updated para el objeto.
|
{"gcs_metadata":{"content_type":"image/png","md5_hash":"dfbbb5cf034af026d89f2dc16930be15","size":915052,"updated":1560286006000000}} |
El campo content_type en el campo gcs_metadata de la columna details se recupera de Cloud Storage. Puedes establecer el
tipo de contenido de un objeto en
Cloud Storage. Si lo omites en Cloud Storage, BigQuery infiere el tipo de contenido del sufijo del URI.
Crea valores ObjectRef
Puedes crear valores ObjectRef con
tablas de objetos, la
OBJ.MAKE_REF función,
o conjuntos de datos de Cloud Storage Insights.
Usa tablas de objetos
Usa una tabla de objetos si no tienes URIs almacenados en una tabla y deseas enumerar todos los objetos de un prefijo de Cloud Storage. Una tabla de objetos almacena la referencia a un objeto en cada fila y tiene una columna ref que contiene valores ObjectRef. La siguiente consulta usa la
CREATE EXTERNAL TABLE instrucción
para crear una tabla 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;
Los valores ObjectRef de una tabla de objetos deben tener un autorizador para
el acceso delegado. La conexión del autorizador es la misma que usas para crear la tabla de objetos.
Usa la función OBJ.MAKE_REF
Usa la OBJ.MAKE_REF
función si ya tienes URIs almacenados en una tabla y deseas crear
ObjectRef valores a partir de esos URIs. En las siguientes consultas, se muestra cómo crear valores ObjectRef en la columna image_ref a partir de la columna uri que contiene URIs de 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 los autorizadores de un valor ObjectRef existente, puedes usar la función 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;
La función OBJ.MAKE_REF acepta un autorizador anulable para admitir
el acceso directo y el acceso delegado.
Usa conjuntos de datos de Cloud Storage Insights
Si tienes configurado un
conjunto de datos de Storage Insights,
el conjunto de datos ya incluye una
ref columna
que contiene ObjectRef valores. Los valores ObjectRef creados en conjuntos de datos de Storage Insights no tienen un autorizador. Para consultar estos objetos, debes
tener acceso directo al objeto o agregar un autorizador
a la ObjectRef para usar acceso delegado.
Autorizador y permisos
Cuando pasas un valor ObjectRef a funciones de ObjectRef, funciones de IA o UDF de Python, esas funciones deben acceder al objeto almacenado en Cloud Storage. Puedes autorizar este acceso según el valor del campo authorizer de dos maneras: acceso directo y acceso delegado.
Acceso directo
Con el acceso directo, el usuario que ejecuta la consulta accede al objeto directamente
con sus propias credenciales. El acceso directo se usa cuando el valor ObjectRef no tiene autorizador.
El acceso directo tiene las siguientes restricciones:
- El usuario debe tener permiso para acceder a los objetos.
- Un trabajo de consulta que usa las
AI.GENERATE,AI.IF,AI.SCOREoAI.CLASSIFYfunciones sin una conexión requiere que el usuario tenga permisos adicionales. La consulta solo puede acceder a los buckets y objetos de Cloud Storage del mismo proyecto en el que se ejecuta el trabajo.
Por ejemplo, si llamas a la función AI.GENERATE en un valor ObjectRef que no tiene un autorizador, la función lee el objeto como tú. Si no tienes permiso para leer el objeto, la función escribe un
"permission denied" error en la status columna del resultado.
En el siguiente ejemplo, se muestra una consulta que usa acceso directo:
-- 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')));
Acceso delegado
Con el acceso delegado, el usuario que ejecuta la consulta delega el acceso a objetos
a una conexión de recursos de Cloud de BigQuery,
que se especifica en el campo authorizer del valor ObjectRef.
El acceso delegado puede habilitar el acceso a datos de varios proyectos.
Para usar el acceso delegado, el administrador de datos debe seguir estos pasos para configurar la conexión y los permisos:
- Configuración única. El administrador de datos debe
configurar una conexión de recursos de Cloud
para administrar el bucket de Cloud Storage:
- Crea una conexión de recursos de Cloud de BigQuery nueva o reutiliza una existente en el proyecto.
- Busca la cuenta de servicio en los metadatos de la conexión.
- Otorga a la cuenta de servicio el
storage.objects.getpermiso para las lecturas o elstorage.objects.createpermiso para las escrituras en el proyecto o en los buckets de Cloud Storage. Puedes otorgar estos permisos con los roles de visualizador de objetos de Storage o usuario de objetos de Storage.
- Configuración por usuario. El administrador de datos debe otorgar a los usuarios el
bigquery.objectRefs.readpermiso para las lecturas o elbigquery.objectRefs.writepermiso para las escrituras a la conexión de BigQuery. Puedes otorgar estos permisos con los roles de lector de ObjectRef de BigQuery o administrador de ObjectRef de BigQuery.
Por ejemplo, si un usuario pasa valores ObjectRef que tienen un autorizador a una función AI.GENERATE, la función verifica que el usuario tenga el permiso bigquery.objectRefs.read y, luego, lee los objetos con la cuenta de servicio de la conexión. Si el usuario o la cuenta de servicio no tienen
permisos suficientes, la función escribe un error "permission denied"en la columna statusdel resultado.
En el siguiente ejemplo, se muestra una consulta que usa acceso delegado. Requiere lo siguiente:
- El usuario tiene el permiso
bigquery.objectRefs.readenconnection1. - La cuenta de servicio de
connection1tiene el permisostorage.objects.geten el objeto. - La cuenta de servicio de
connection2tiene el rol de usuario de 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ácticas recomendadas
Ten en cuenta las siguientes prácticas recomendadas cuando decidas si usar acceso directo o delegado:
- Usa el acceso directo para un equipo pequeño que opera en un solo proyecto para el almacenamiento y el análisis de datos. El administrador de datos usa Identity and Access Management para otorgar a los usuarios acceso a los datos de BigQuery y a los datos de Cloud Storage. Los usuarios pueden crear valores
ObjectRefa pedido sin un autorizador para analizar objetos con sus propias credenciales. - Usa el acceso delegado para un equipo grande que opera en varios proyectos, en especial cuando el almacenamiento y el análisis de datos están separados. El administrador de datos puede configurar conexiones y crear valores
ObjectRefpara el análisis con anticipación con una conexión como su autorizador. Este enfoque funciona con tablas de objetos o conOBJ.MAKE_REFen una lista de URIs. Luego, el administrador de datos puede compartir la tabla que almacena los valoresObjectRefcon los analistas. Los analistas no necesitan acceder al bucket original para analizar los objetos.
Errores
Las funciones que consumen valores ObjectRef informan errores de dos maneras:
- Falla de la consulta: La consulta puede fallar con un mensaje de error y sin resultado.
- Valores de error que se muestran: La consulta se realiza correctamente, pero la función puede escribir errores como parte del valor que se muestra. Para obtener información sobre el formato del valor que se muestra, consulta la página de referencia de la función que usas.
Cuando una función muestra un valor ObjectRef, el campo details de ese valor puede contener un campo errors. Si lo hace, el valor de ese campo es un array de errores. Cada error tiene el siguiente esquema:
| Nombre | Tipo | Modo | Descripción | Ejemplo |
|---|---|---|---|---|
code |
INT64 |
REQUIRED |
Es el código de error HTTP estándar. | 400 |
message |
STRING |
REQUIRED |
Es un mensaje de error descriptivo y fácil de usar. | "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 |
Es el nombre de la función que activó el error. | "OBJ.MAKE_REF" |
Estos son dos tipos comunes de errores:
- Error de objeto: El URI o la versión del objeto proporcionados no existen.
- Error del autorizador: La conexión no existe o el usuario no tiene permiso para usarla para el acceso delegado.
En la siguiente consulta, se muestra cómo seleccionar valores ObjectRef que contienen errores
de una columna Objectref:
SELECT ref
FROM mydataset.images
WHERE ref.details.errors IS NOT NULL;
¿Qué sigue?
- Especifica columnas
ObjectRefen esquemas de tablas. - Analiza datos multimodales.
- Obtén más información sobre las funciones de ObjectRef.