Utilizzare i valori ObjectRef
Questo documento descrive i valori 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 OBJ funzioni,
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 di connessione BigQuery per l'accesso delegato
o NULL per l'accesso diretto.
L'ID può avere i seguenti formati: "region.connection"or "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 contenuti di un oggetto in Cloud Storage. Se lo ometti in Cloud Storage, BigQuery deduce il tipo di contenuti dal suffisso dell'URI.
Creare valori ObjectRef
Puoi creare valori ObjectRef utilizzando
tabelle di oggetti, la
OBJ.MAKE_REF funzione,
o set di dati di Storage Insights.
Utilizzare le tabelle di oggetti
Utilizza una tabella di oggetti se non hai URI archiviati in una tabella e vuoi elencare tutti gli oggetti da un prefisso Cloud Storage. Una tabella di oggetti archivia il riferimento a un oggetto in ogni riga e ha una colonna ref che contiene valori ObjectRef. La seguente query utilizza l'
CREATE EXTERNAL TABLE istruzione
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 connessione che utilizzi per creare la tabella di oggetti.
Utilizzare la funzione OBJ.MAKE_REF
Utilizza la OBJ.MAKE_REF
funzione se hai già URI archiviati in una tabella e vuoi creare
ObjectRef valori da questi URI. Le seguenti query mostrano come creare valori ObjectRef nella colonna image_ref dalla colonna uri che contiene gli URI di 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 autorizzatori 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 i set di dati di Storage Insights
Se hai configurato un
set di dati di Storage Insights,
il set di dati include già una
ref colonna
che contiene ObjectRef valori. I valori ObjectRef creati nei set di dati di Storage Insights non hanno un autorizzatore. Per eseguire query su questi oggetti, devi
avere accesso diretto all'oggetto o aggiungere un autorizzatore
a ObjectRef per utilizzare l'accesso delegato.
Autorizzatore e autorizzazioni
Quando passi un valore ObjectRef a funzioni ObjectRef, funzioni AI o 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 avere l'autorizzazione per accedere agli oggetti.
- Un job di query che utilizza le
AI.GENERATE,AI.IF,AI.SCOREoAI.CLASSIFYfunzioni senza una connessione richiede che l'utente disponga di autorizzazioni aggiuntive. La query può accedere solo ai bucket e agli 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
"permission denied" errore nella status colonna del risultato.
Il seguente esempio 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 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')));
Accesso delegato
Con accesso delegato, l'utente che esegue la query delega l'accesso all'oggetto
a una connessione alle risorse Cloud di BigQuery,
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 di 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'
bigquery.objectRefs.readautorizzazione per le letture o l'bigquery.objectRefs.writeautorizzazione per le scritture alla connessione BigQuery. Puoi concedere queste autorizzazioni con i ruoli Lettore ObjectRef BigQuery o Amministratore ObjectRef BigQuery.
Ad esempio, se un utente passa 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 dispongono di
autorizzazioni sufficienti, la funzione scrive un errore "permission denied"
nella colonna status del risultato.
Il seguente esempio mostra una query che utilizza l'accesso delegato. Richiede quanto segue:
- L'utente ha l'autorizzazione
bigquery.objectRefs.readsuconnection1. - Il account di servizio per
connection1ha l'autorizzazionestorage.objects.getsull'oggetto. - Il account di servizio per
connection2ha il ruolo Utente 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");
Best practice
Prendi in esame queste best practice quando decidi se utilizzare l'accesso diretto o delegato:
- Utilizza l'accesso diretto per un piccolo team che opera in un singolo progetto sia per l'archiviazione che per l'analisi dei dati. L'amministratore dei dati utilizza Identity and Access Management per concedere agli utenti l'accesso ai dati BigQuery e ai dati di 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 di grandi dimensioni 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 in anticipo valori
ObjectRefper l'analisi con una connessione come autorizzatore. Questo approccio funziona con le tabelle di oggetti o utilizzandoOBJ.MAKE_REFsu un elenco di URI. L'amministratore dei dati può quindi condividere la tabella che memorizza i valoriObjectRefcon gli analisti. Gli analisti non devono accedere al bucket originale per analizzare gli oggetti.
Errori
Le funzioni che utilizzano i valori ObjectRef segnalano gli errori in due modi:
- Errore di 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 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 di questo 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 utilizzo. | "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 dell'oggetto: l'URI o la versione dell'oggetto forniti non esistono.
- Errore dell'autorizzatore: la connessione non esiste o l'utente non ha l'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;
Passaggi successivi
- Specifica le colonne
ObjectRefnegli schemi delle tabelle. - Analizza i dati multimodali.
- Scopri di più sulle funzioni ObjectRef.