Utilizzare i valori ObjectRef
Questo documento descrive i valori di ObjectRef e come crearli e utilizzarli in BigQuery.
Un valore ObjectRef è un tipo STRUCT
con uno schema predefinito che fa riferimento agli oggetti Cloud Storage per l'analisi multimodale. Può essere
elaborato da funzioni OBJ,
funzioni AI o
funzioni definite dall'utente Python.
Schema
Un valore ObjectRef ha i seguenti campi:
| Nome | Tipo | Modalità | Descrizione | Esempio |
|---|---|---|---|---|
uri |
STRING |
REQUIRED |
L'URI dell'oggetto Cloud Storage. | "gs://cloud-samples-data/vision/demo-img.jpg" |
version |
STRING |
NULLABLE |
La generazione dell'oggetto. | "1560286006357632" |
authorizer |
STRING |
NULLABLE |
Un ID connessione BigQuery per l'accesso
delegato o NULL per l'accesso diretto.
L'ID può avere i seguenti formati: "region.connection"o "project.region.connection" |
"myproject.us.myconnection" |
details |
JSON |
NULLABLE |
I metadati dell'oggetto o gli errori durante l'elaborazione dell'oggetto. Può includere i campi content_type, md5_hash, size e updated per l'oggetto.
|
{"gcs_metadata":{"content_type":"image/png","md5_hash":"dfbbb5cf034af026d89f2dc16930be15","size":915052,"updated":1560286006000000}} |
Il campo content_type nel campo gcs_metadata della colonna details
viene recuperato da Cloud Storage. Puoi impostare il tipo di contenuto di un oggetto in Cloud Storage. Se lo ometti in Cloud Storage, BigQuery deduce il tipo di contenuto dal suffisso dell'URI.
Crea valori ObjectRef
Puoi creare valori ObjectRef utilizzando le tabelle degli oggetti, la funzione OBJ.MAKE_REF, la funzione OBJ.LIST o i set di dati Cloud Storage Insights.
Utilizzare le tabelle di oggetti
Utilizza una tabella di oggetti se non hai URI archiviati in una tabella e vuoi rendere persistente
un elenco di tutti gli oggetti di un prefisso Cloud Storage. Una tabella degli oggetti
memorizza il riferimento a un oggetto in ogni riga e ha una colonna ref che
contiene valori ObjectRef. La seguente query utilizza l'istruzione
CREATE EXTERNAL TABLE
per creare una tabella di oggetti:
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;
I valori ObjectRef di una tabella di oggetti devono avere un autorizzatore per l'accesso delegato. La connessione dell'autorizzatore è la stessa
che utilizzi per creare la tabella degli oggetti.
Utilizzare la funzione OBJ.MAKE_REF
Utilizza la funzione OBJ.MAKE_REF
se hai già URI memorizzati in una tabella e vuoi creare
valori ObjectRef da questi URI. Le seguenti query mostrano come
creare valori ObjectRef nella colonna image_ref dalla colonna uri
che contiene URI 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;
Per modificare gli autori di un valore ObjectRef esistente, puoi
utilizzare la funzione 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 funzione OBJ.MAKE_REF accetta un autorizzatore nullable per supportare l'accesso diretto e l'accesso delegato.
Utilizzare la funzione OBJ.LIST
Utilizza la funzione OBJ.LIST
per la scoperta spontanea. La funzione OBJ.LIST restituisce una
tabella di metadati e valori ObjectRef per i file archiviati in Cloud Storage.
I dati di Cloud Storage possono includere documenti, immagini e audio.
L'utilizzo di OBJ.LIST elimina la necessità di creare manualmente i valori ObjectRef in una
tabella persistente. Puoi aggiungere rapidamente oggetti Cloud Storage alle funzioni AI per creare pipeline ETL spontanee che gestiscono la conversione di dati non strutturati in dati strutturati. Se hai bisogno di una tabella persistente e autoaggiornante che
monitori continuamente i nuovi oggetti che arrivano in un bucket nel tempo, devi
creare una tabella degli oggetti BigQuery standard.
La seguente query utilizza il carattere jolly (*) per rilevare tipi di file specifici e la funzione AI.IF per filtrare i dati non strutturati. Questa query
elenca solo i file PNG che contengono un'immagine di un cane.
SELECT
uri,
content_type,
size
FROM
OBJ.LIST('gs://mybucket/images/*.png')
WHERE
AI.IF(('Does this image contain a dog?', ref))
ORDER BY
uri;
Utilizzare i set di dati di Cloud Storage Insights
Se hai configurato un set di dati Storage Insights, il set di dati include già una colonna ref che contiene valori ObjectRef. I valori di ObjectRef creati nei set di dati di Storage
Insights non hanno un autorizzatore. Per eseguire query su questi oggetti, devi disporre dell'accesso diretto all'oggetto o aggiungere un autorizzatore a ObjectRef per utilizzare l'accesso delegato.
Autorizzatore e autorizzazioni
Quando passi un valore ObjectRef alle funzioni ObjectRef, alle funzioni AI o alle UDF Python, queste funzioni devono accedere all'oggetto archiviato in Cloud Storage. Puoi autorizzare questo accesso in base al valore del campo authorizer in due modi: accesso diretto e accesso delegato.
Accesso diretto
Con l'accesso diretto, l'utente che esegue la query accede direttamente all'oggetto
utilizzando le proprie credenziali. L'accesso diretto viene utilizzato quando il valore ObjectRef
non ha un autorizzatore.
L'accesso diretto presenta le seguenti limitazioni:
- L'utente deve disporre dell'autorizzazione per accedere agli oggetti.
- Un job di query che utilizza le funzioni
AI.GENERATE,AI.IF,AI.SCOREoAI.CLASSIFYsenza una connessione richiede che l'utente disponga di autorizzazioni aggiuntive. La query può accedere solo a bucket e oggetti Cloud Storage dello stesso progetto in cui viene eseguito il job.
Ad esempio, se chiami la funzione AI.GENERATE su un valore ObjectRef
che non ha un autorizzatore, la funzione legge l'oggetto come se fossi tu. Se non hai l'autorizzazione per leggere l'oggetto, la funzione scrive un errore "permission denied" nella colonna status del risultato.
L'esempio seguente mostra una query che utilizza l'accesso diretto:
-- Requires that the end user can read the object "gs://cloud-samples-data/vision/demo-img.jpg" and use the Agent Platform model.
SELECT AI.GENERATE(
("Describe this image:",
OBJ.MAKE_REF("gs://cloud-samples-data/vision/demo-img.jpg")));
Accesso delegato
Con l'accesso delegato, l'utente che esegue la query delega l'accesso all'oggetto
a una connessione alla risorsa BigQuery Cloud,
specificata nel campo authorizer del valore ObjectRef.
L'accesso delegato può consentire l'accesso ai dati tra progetti.
Per utilizzare l'accesso delegato, l'amministratore dei dati deve seguire questi passaggi per configurare la connessione e le autorizzazioni:
- Configurazione una tantum. L'amministratore dei dati deve
configurare una connessione alle risorse Cloud
per gestire il bucket Cloud Storage:
- Crea una nuova connessione alle risorse Cloud BigQuery o riutilizzane una esistente nel progetto.
- Cerca il account di servizio nei metadati della connessione.
- Concedi al account di servizio l'autorizzazione
storage.objects.getper le letture o l'autorizzazionestorage.objects.createper le scritture nel progetto o nei bucket Cloud Storage. Puoi concedere queste autorizzazioni con i ruoli Visualizzatore oggetti Storage o Utente oggetti Storage.
- Configurazione per utente. L'amministratore dei dati deve concedere agli utenti l'autorizzazione
bigquery.objectRefs.readper le letture o l'autorizzazionebigquery.objectRefs.writeper le scritture alla connessione BigQuery. Puoi concedere queste autorizzazioni con i ruoli BigQuery ObjectRef Reader o BigQuery ObjectRef Admin.
Ad esempio, se un utente trasmette valori ObjectRef con un autorizzatore a una funzione AI.GENERATE, la funzione verifica che l'utente disponga dell'autorizzazione bigquery.objectRefs.read e poi legge gli oggetti utilizzando il account di servizio della connessione. Se l'utente o il account di servizio non dispone di autorizzazioni sufficienti, la funzione scrive un errore "permission denied" nella colonna status del risultato.
L'esempio seguente mostra una query che utilizza l'accesso delegato. Richiede quanto segue:
- L'utente dispone dell'autorizzazione
bigquery.objectRefs.readperconnection1. - Il account di servizio per
connection1dispone dell'autorizzazionestorage.objects.getper l'oggetto. - Il account di servizio per
connection2ha il ruolo Utente di Agent Platform.
SELECT AI.GENERATE(
("Describe this image:",
OBJ.MAKE_REF("gs://cloud-samples-data/vision/demo-img.jpg", "us.connection1")),
connection_id => "us.connection2");
All'interno di un perimetro dei Controlli di servizio VPC, le funzioni di AI non possono elaborare i valori ObjectRef che utilizzano l'accesso delegato. L'accesso delegato
genera un URL HTTPS firmato per l'oggetto e
Gemini Enterprise Agent Platform blocca i recuperi HTTP e HTTPS
per i progetti all'interno di un perimetro. La funzione scrive il seguente errore nella colonnastatus del risultato:
INVALID_ARGUMENT: HTTP links are not supported for requests restricted by VPCSC.
Poiché la colonna ref di una
tabella degli oggetti utilizza sempre la connessione
della tabella degli oggetti come autorizzatore, il passaggio di ref a una funzione AI all'interno di un
perimetro restituisce sempre questo errore. Per analizzare l'oggetto, passa un valore OBJ.MAKE_REF(uri) con un solo argomento, che utilizza l'accesso diretto e invia l'URI Cloud Storage al modello senza generare un URL firmato.
Best practice
Quando decidi se utilizzare l'accesso diretto o delegato, tieni presente le seguenti best practice:
- Utilizza l'accesso diretto per un piccolo team che opera in un singolo progetto per
l'archiviazione e l'analisi dei dati. L'amministratore dei dati utilizza Identity and Access Management per
concedere agli utenti l'accesso ai dati BigQuery e
Cloud Storage. Gli utenti possono creare valori
ObjectRefon demand senza un autorizzatore per analizzare gli oggetti utilizzando le proprie credenziali. - Utilizza l'accesso delegato per un team numeroso che opera su più progetti, soprattutto quando l'archiviazione e l'analisi dei dati sono disaccoppiate. L'amministratore dei dati può configurare le connessioni e creare valori
ObjectRefper l'analisi in anticipo con una connessione come autorizzatore. Questo approccio funziona con le tabelle degli oggetti o utilizzandoOBJ.MAKE_REFin un elenco di URI. A questo punto, l'amministratore dei dati può condividere la tabella che memorizza i valori diObjectRefcon gli analisti. Gli analisti non devono accedere al bucket originale per analizzare gli oggetti.
Errori
Le funzioni che utilizzano valori ObjectRef segnalano gli errori in due modi:
- Errore della query: la query potrebbe non riuscire con un messaggio di errore e nessun risultato.
- Valori di errore restituiti: la query ha esito positivo, ma la funzione potrebbe scrivere gli errori come parte del valore restituito. Per informazioni sul formato del valore restituito, consulta la pagina di riferimento della funzione che stai utilizzando.
Quando una funzione restituisce un valore ObjectRef, il campo details di questo valore potrebbe contenere un campo errors. In questo caso, il valore del campo è
un array di errori. Ogni errore ha il seguente schema:
| Nome | Tipo | Modalità | Descrizione | Esempio |
|---|---|---|---|---|
code |
INT64 |
REQUIRED |
Codice di errore HTTP standard. | 400 |
message |
STRING |
REQUIRED |
Un messaggio di errore descrittivo e di facile comprensione. | "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 |
Il nome della funzione che ha attivato l'errore. | "OBJ.MAKE_REF" |
Questi sono due tipi comuni di errori:
- Errore oggetto: l'URI o la versione dell'oggetto forniti non esistono.
- Errore di autorizzazione: la connessione non esiste o l'utente non dispone dell'autorizzazione per utilizzarla per l'accesso delegato.
La seguente query mostra come selezionare i valori ObjectRef che contengono errori
da una colonna Objectref:
SELECT ref
FROM mydataset.images
WHERE ref.details.errors IS NOT NULL;