Mappa i nomi degli oggetti SQL per la traduzione batch
La mappatura dei nomi degli oggetti consente di configurare regole JSON per rinominare gli oggetti SQL, come database, schemi, tabelle e colonne, durante la traduzione SQL batch in modo che corrispondano alle convenzioni di denominazione di BigQuery.
La mappatura dei nomi degli oggetti tramite JSON è supportata solo dall'API batch legacy. Se utilizzi l'API BigQuery Migration o avvii job batch dalla console Google Cloud , utilizza invece la mappatura dei nomi degli oggetti basata su YAML.
Panoramica
La mappatura dei nomi ti consente di identificare i nomi degli oggetti SQL nei file di origine e di specificare i nomi di destinazione per questi oggetti in BigQuery. Puoi utilizzare alcuni o tutti i seguenti componenti per configurare la mappatura dei nomi per un oggetto:
- Una regola di mappatura dei nomi, composta da:
- Parti del nome di origine che forniscono il nome completo dell'oggetto nel sistema di origine.
- Un tipo che identifica il tipo di oggetto di origine.
- Parti del nome di destinazione che forniscono il nome dell'oggetto in BigQuery.
- Un nome di database predefinito da utilizzare con tutti gli oggetti di origine che non ne specificano uno.
- Un nome di schema predefinito da utilizzare con tutti gli oggetti di origine che non ne specificano uno.
Parti del nome
Puoi fornire i valori per i nomi degli oggetti di origine e di destinazione in una regola di mappatura dei nomi utilizzando una combinazione delle seguenti parti del nome:
- Database: il livello più alto della gerarchia di denominazione. La piattaforma di origine potrebbe utilizzare un termine alternativo, ad esempio progetto.
- Schema: il secondo livello della gerarchia di denominazione. La piattaforma di origine potrebbe utilizzare un termine alternativo, ad esempio set di dati.
- Relazione: il terzo livello della gerarchia di denominazione. La piattaforma di origine potrebbe utilizzare un termine alternativo, ad esempio tabella.
- Attributo: il livello più basso della gerarchia di denominazione. La piattaforma di origine potrebbe utilizzare un termine alternativo, ad esempio colonna.
Tipi di oggetti
Devi anche specificare il tipo di oggetto di origine che stai rinominando in una regola di mappatura dei nomi. Sono supportati i seguenti tipi di oggetti:
Database: un oggetto di primo livello nella gerarchia degli oggetti, ad esempiodatabase.schema.relation.attribute. La piattaforma di origine potrebbe utilizzare un termine alternativo, ad esempio progetto. Se specifichidatabasecome tipo di oggetto, tutti i riferimenti alla stringa di origine vengono modificati sia nelle istruzioni DDL che in quelle DML.Schema: un oggetto di secondo livello nella gerarchia degli oggetti. La piattaforma di origine potrebbe utilizzare un termine alternativo, ad esempio set di dati. Se specifichischemacome tipo di oggetto, tutti i riferimenti alla stringa di origine vengono modificati sia nelle istruzioni DDL che in quelle DML.Relation: un oggetto di terzo livello nella gerarchia degli oggetti. La piattaforma di origine potrebbe utilizzare un termine alternativo, ad esempio tabella. Se specifichirelationcome tipo di oggetto, tutti i riferimenti alla stringa di origine nelle istruzioni DDL vengono modificati.Relation alias: un alias per un oggetto di terzo livello. Ad esempio, nella querySELECT t.field1, t.field2 FROM myTable t;,tè un alias di relazione. Nella querySELECT field1, field2 FROM schema1.table1, anchetable1è un alias di relazione. Se specifichirelation aliascome tipo di oggetto, vengono creati alias per tutti i riferimenti alla stringa di origine nelle istruzioni DML. Ad esempio, setableAè specificato come nome della destinazione, gli esempi precedenti vengono tradotti rispettivamente inSELECT tableA.field1, tableA.field2 FROM myTable AS tableA;eSELECT tableA.field1, tableA.field2 FROM schema1.table1 AS tableA.Function: una procedura, ad esempiocreate procedure db.test.function1(a int). Se specifichifunctioncome tipo di oggetto, tutti i riferimenti alla stringa di origine vengono modificati sia nelle istruzioni DDL che in quelle DML.Attribute: un oggetto di quarto livello nella gerarchia degli oggetti. La piattaforma di origine potrebbe utilizzare un termine alternativo, ad esempio colonna. Se specifichiattributecome tipo di oggetto, tutti i riferimenti alla stringa di origine nelle istruzioni DDL vengono modificati.Attribute alias: un alias per un oggetto di quarto livello. Ad esempio, nella querySELECT field1 FROM myTable;,field1è un alias di attributo. Se specifichiattribute aliascome tipo di oggetto, tutti i riferimenti alla stringa di origine nelle istruzioni DML vengono modificati.
Parti del nome obbligatorie per i tipi di oggetti
Per descrivere un oggetto in una regola di mappatura dei nomi, utilizza le parti del nome identificate per ogni tipo di oggetto nella tabella seguente:
| Tipo | Nome oggetto di origine | Nome dell'oggetto target | ||||||
|---|---|---|---|---|---|---|---|---|
| Parte del nome del database | Parte del nome dello schema | Parte del nome della relazione | Parte del nome dell'attributo | Parte del nome del database | Parte del nome dello schema | Parte del nome della relazione | Parte del nome dell'attributo | |
Database |
X | X | ||||||
Schema |
X | X | X | X | ||||
Relation |
X | X | X | X | X | X | ||
Function |
X | X | X | X | X | X | ||
Attribute |
X | X | X | X | X | |||
Attribute alias |
X | X | X | X | X | |||
Relation alias |
X | X | ||||||
Database predefinito
Se vuoi aggiungere un nome di progetto BigQuery a tutti gli oggetti tradotti, la cosa più semplice da fare è specificare un nome di database predefinito quando crei un job di traduzione. Questo vale per i file di origine in cui viene utilizzata la denominazione in tre parti o in cui viene utilizzata la denominazione in quattro parti, ma non viene specificato il nome dell'oggetto di livello più alto.
Ad esempio, se specifichi il nome del database predefinito myproject, un'istruzione di origine come SELECT * FROM database.table viene tradotta in SELECT * FROM myproject.database.table. Se hai oggetti che utilizzano già una parte del nome del database, ad esempio SELECT * FROM database.schema.table, devi utilizzare una regola di mappatura dei nomi per rinominare database.schema.table in myproject.schema.table.
Schema predefinito
Se vuoi specificare i nomi completi di tutti gli oggetti nei file di origine che non utilizzano la denominazione in quattro parti, puoi fornire sia un nome del database predefinito sia un nome dello schema predefinito quando crei un job di traduzione. Il nome dello schema predefinito viene fornito come primo nome dello schema nell'opzione del percorso di ricerca dello schema.
Ad esempio, se specifichi il nome del database predefinito myproject e il nome dello schema predefinito myschema, le seguenti istruzioni di origine:
SELECT * FROM database.tableSELECT * FROM table1
Vengono tradotti in:
SELECT * FROM myproject.database.table.SELECT * FROM myproject.myschema.table1
Comportamento delle regole di mappatura dei nomi
Le sezioni seguenti descrivono il comportamento delle regole di mappatura dei nomi.
L'ereditarietà delle regole segue la gerarchia degli oggetti
Una modifica del nome che interessa un oggetto di livello superiore influisce sull'oggetto di destinazione e anche su tutti i relativi oggetti secondari nella stessa gerarchia.
Ad esempio, se specifichi la seguente regola di mappatura dei nomi con un tipo di oggetto schema:
| Parte del nome | Origine | Destinazione |
|---|---|---|
| Database | sales_db |
sales |
| Schema | cust_mgmt |
cms |
| Relazione | ||
| Attributo |
Quando viene applicata, vengono modificate anche le parti del nome del database e dello schema di tutti gli oggetti relation e attribute nello schema sales_db.cust_mgmt. Ad esempio, un oggetto relation denominato sales_db.cust_mgmt.history diventa sales.cms.history.
Al contrario, le modifiche ai nomi che hanno come target oggetti di livello inferiore non influiscono sugli oggetti di livello superiore o dello stesso livello nella gerarchia degli oggetti.
Ad esempio, se specifichi la seguente regola di mappatura dei nomi con un tipo di oggetto relation:
| Parte del nome | Origine | Destinazione |
|---|---|---|
| Database | sales_db |
sales |
| Schema | cust_mgmt |
cms |
| Relazione | clients |
accounts |
| Attributo |
Quando viene applicato, non viene modificato il nome di nessun altro oggetto ai livelli sales_db o sales_db.cust_mgmt della gerarchia degli oggetti.
Viene applicata la regola più specifica
A un oggetto viene applicata una sola regola di mappatura dei nomi. Se più regole potrebbero influire su un singolo oggetto, viene applicata la regola che influisce sulla parte del nome di livello più basso. Ad esempio, se una regola di mappatura del nome di tipo database e una regola di mappatura del nome di tipo schema potrebbero influire entrambe sul nome di un oggetto relation, viene applicata la regola di mappatura del nome di tipo schema.
Utilizza una combinazione univoca di valori per tipo e origine
Non puoi specificare più di una regola di mappatura dei nomi con gli stessi valori di tipo e origine. Ad esempio, non puoi specificare entrambe le seguenti regole di mappatura dei nomi:
Regola 1, tipo attribute |
Regola 2, tipo attribute |
|||
|---|---|---|---|---|
| Parte del nome | Origine | Destinazione | Origine | Destinazione |
| Database | project |
project |
||
| Schema | dataset1 |
dataset1 |
||
| Relazione | table1 |
table1 |
||
| Attributo | lname |
last_name |
lname |
lastname |
Crea regole di mappatura dei nomi attribute e attribute alias corrispondenti
Quando utilizzi una regola di mappatura dei nomi di tipo attribute per modificare il nome di un attributo nelle istruzioni DDL, devi creare una regola di mappatura dei nomi attribute alias per modificare il nome dell'attributo anche nelle istruzioni DML.
Le modifiche ai nomi non vengono applicate a cascata
Le modifiche ai nomi non vengono applicate a cascata alle regole dei nomi.
Ad esempio, se hai creato una regola di mappatura dei nomi che rinomina database1 in project1 e un'altra che rinomina project1 in project2, il traduttore non mappa database1 in project2.
Gestisci gli oggetti di origine che non hanno nomi in quattro parti
Alcuni sistemi di origine, come Teradata, utilizzano tre parti del nome per qualificare completamente i nomi degli oggetti. Molti sistemi di origine consentono anche di utilizzare nomi parzialmente qualificati nei loro dialetti SQL, ad esempio utilizzando database1.schema1.table1, schema1.table1 e table1 per fare riferimento allo stesso oggetto in contesti diversi. Se i file di origine contengono oggetti che non utilizzano nomi di oggetti in quattro parti, puoi utilizzare la mappatura dei nomi in combinazione con la specifica di un nome del database predefinito e di un nome dello schema predefinito per ottenere la mappatura dei nomi che preferisci.
Per esempi di utilizzo delle regole di mappatura dei nomi con un nome di database predefinito o un nome di schema predefinito, consulta Modifica la parte del nome del database per gli oggetti con livelli variabili di completamento del nome e Modifica un nome di oggetto di relazione parzialmente qualificato.
Esempi di mappatura dei nomi
Utilizza gli esempi in questa sezione per vedere come funzionano le regole di mappatura dei nomi per i casi d'uso comuni.
Modifica la parte del nome del database per gli oggetti con nome completo
L'esempio seguente rinomina la parte del nome del database da td_project
a bq_project per tutti gli oggetti database, schema, relation e function
che hanno nomi completi.
Parti del nome di origine e di destinazione
| Parte del nome | Origine | Destinazione |
|---|---|---|
| Database | td_project |
bq_project |
| Schema | ||
| Relazione | ||
| Attributo |
Tipo
database
Input di esempio
SELECT * FROM td_project.schema.table;SELECT * FROM td_project.schema1.table1;
Output di esempio
SELECT * FROM bq_project.schema.table;SELECT * FROM bq_project.schema1.table1
Modifica la parte del nome del database per gli oggetti con livelli variabili di completamento del nome
L'esempio seguente rinomina la parte del nome del database project in bq_project per tutti i tipi di oggetti e aggiunge anche bq_project come parte del nome del database per gli oggetti che non ne specificano uno.
Per farlo, devi specificare un valore predefinito per il database durante la configurazione del job di traduzione, oltre a specificare le regole di mappatura dei nomi. Per saperne di più su come specificare un nome di database predefinito, consulta Invia un job di traduzione.
Valore predefinito del database
project
Parti del nome di origine e di destinazione
| Parte del nome | Origine | Destinazione |
|---|---|---|
| Database | project |
bq_project |
| Schema | ||
| Relazione | ||
| Attributo |
Tipo
database
Input di esempio
SELECT * FROM project.schema.table;SELECT * FROM schema1.table1;
Output di esempio
SELECT * FROM bq_project.schema.table;SELECT * FROM bq_project.schema1.table1
Modifica la parte del nome del database e la parte del nome dello schema per gli oggetti con nome completo
L'esempio seguente modifica la parte del nome del database warehouse1 in
myproject e modifica anche la parte del nome dello schema database1
in mydataset.
Puoi anche modificare le parti di un nome di oggetto relation nello stesso modo, utilizzando un tipo relation e specificando i valori di origine e di destinazione per la parte del nome della relazione.
Parti del nome di origine e di destinazione
| Parte del nome | Origine | Destinazione |
|---|---|---|
| Database | warehouse1 |
myproject |
| Schema | database1 |
mydataset |
| Relazione | ||
| Attributo |
Tipo
schema
Input di esempio
SELECT * FROM warehouse1.database1.table1;SELECT * FROM database2.table2;
Output di esempio
SELECT * FROM myproject.mydataset.table1;SELECT * FROM __DEFAULT_DATABASE__.database2.table2;
Modifica un nome di oggetto relation completo
L'esempio seguente rinomina mydb.myschema.mytable in
mydb.myschema.table1.
Parti del nome di origine e di destinazione
| Parte del nome | Origine | Destinazione |
|---|---|---|
| Database | mydb |
mydb |
| Schema | myschema |
myschema |
| Relazione | mytable |
table1 |
| Attributo |
Tipo
relation
Input di esempio
CREATE table mydb.myschema.mytable(id int, name varchar(64));
Output di esempio
CREATE table mydb.myschema.table1(id integer, name string(64));
Modifica un nome di oggetto relation parzialmente qualificato
L'esempio seguente rinomina myschema.mytable in
mydb.myschema.table1.
Valore predefinito del database
mydb
Parti del nome di origine e di destinazione
| Parte del nome | Origine | Destinazione |
|---|---|---|
| Database | mydb |
mydb |
| Schema | myschema |
myschema |
| Relazione | mytable |
table1 |
| Attributo |
Tipo
relation
Input di esempio
CREATE table myschema.mytable(id int, name varchar(64));
Output di esempio
CREATE table mydb.myschema.table1(id integer, name string(64));
Modifica il nome di un oggetto relation alias
L'esempio seguente rinomina tutte le istanze dell'oggetto relation alias
table in t.
Parti del nome di origine e di destinazione
| Parte del nome | Origine | Destinazione |
|---|---|---|
| Database | ||
| Schema | ||
| Relazione | table |
t |
| Attributo |
Tipo
relation alias
Input di esempio
SELECT table.id, table.name FROM mydb.myschema.mytable table
Output di esempio
SELECT t.id, t.name FROM mydb.myschema.mytable AS t
Modifica il nome di un oggetto function
L'esempio seguente rinomina mydb.myschema.myfunction in
mydb.myschema.function1.
Parti del nome di origine e di destinazione
| Parte del nome | Origine | Destinazione |
|---|---|---|
| Database | mydb |
mydb |
| Schema | myschema |
myschema |
| Relazione | myprocedure |
procedure1 |
| Attributo |
Tipo
function
Input di esempio
CREATE PROCEDURE mydb.myschema.myprocedure(a int) BEGIN declare i int; SET i = a + 1; END;CALL mydb.myschema.myprocedure(7)
Output di esempio
CREATE PROCEDURE mydb.myschema.procedure1(a int) BEGIN declare i int; SET i = a + 1; END;CALL mydb.myschema.procedure1(7);
Modifica il nome di un oggetto attribute
L'esempio seguente rinomina mydb.myschema.mytable.myfield in
mydb.myschema.mytable.field1. Poiché gli oggetti attribute si trovano al livello più basso della gerarchia degli oggetti, questa mappatura dei nomi non modifica il nome di nessun altro oggetto.
Parti del nome di origine e di destinazione
| Parte del nome | Origine | Destinazione |
|---|---|---|
| Database | mydb |
|
| Schema | myschema |
|
| Relazione | mytable |
|
| Attributo | myfield |
field1 |
Tipo
attribute
Input di esempio
CREATE table mydb.myschema.mytable(myfield int, name varchar(64), revenue int);
Output di esempio
CREATE table mydb.myschema.mytable(field1 int, name varchar(64), revenue int);
Modifica il nome di un oggetto attribute alias
L'esempio seguente rinomina mydb.myschema.mytable.myfield in
mydb.myschema.mytable.field1. Poiché gli oggetti attribute alias si trovano al livello più basso della gerarchia degli oggetti, questa mappatura dei nomi non modifica il nome di nessun altro oggetto.
Parti del nome di origine e di destinazione
| Parte del nome | Origine | Destinazione |
|---|---|---|
| Database | mydb |
|
| Schema | myschema |
|
| Relazione | mytable |
|
| Attributo | myfield |
field1 |
Tipo
attribute alias
Input di esempio
SELECT myfield, name FROM mydb.myschema.mytable;
Output di esempio
SELECT field1, name FROM mydb.myschema.mytable;
Formato file JSON
Se scegli di specificare le regole di mappatura dei nomi utilizzando un file JSON anziché la console Google Cloud , il file JSON deve seguire questo formato:
{
"name_map": [
{
"source": {
"type": "string",
"database": "string",
"schema": "string",
"relation": "string",
"attribute": "string"
},
"target": {
"database": "string",
"schema": "string",
"relation": "string",
"attribute": "string"
}
}
]
}
Le dimensioni del file devono essere inferiori a 5 MB.
Per saperne di più su come specificare le regole di mappatura dei nomi per un job di traduzione, consulta Invia un job di traduzione.
Esempi di JSON
I seguenti esempi mostrano come specificare le regole di mappatura dei nomi utilizzando i file JSON.
Esempio 1
Le regole di mappatura dei nomi in questo esempio apportano le seguenti modifiche ai nomi degli oggetti:
- Rinomina le istanze dell'oggetto
relationproject.dataset2.table2inbq_project.bq_dataset2.bq_table2. - Rinomina tutte le istanze dell'oggetto
databaseprojectinbq_project. Ad esempio,project.mydataset.table2diventabq_project.mydataset.table2eCREATE DATASET project.mydatasetdiventaCREATE DATASET bq_project.mydataset.
{
"name_map": [{
"source": {
"type": "RELATION",
"database": "project",
"schema": "dataset2",
"relation": "table2"
},
"target": {
"database": "bq_project",
"schema": "bq_dataset2",
"relation": "bq_table2"
}
}, {
"source": {
"type": "DATABASE",
"database": "project"
},
"target": {
"database": "bq_project"
}
}]
}
Esempio 2
Le regole di mappatura dei nomi in questo esempio apportano le seguenti modifiche ai nomi degli oggetti:
- Rinomina le istanze dell'oggetto
project.dataset2.table2.field1attributeinbq_project.bq_dataset2.bq_table2.bq_fieldnelle istruzioni DDL e DML.
{
"name_map": [{
"source": {
"type": "ATTRIBUTE",
"database": "project",
"schema": "dataset2",
"relation": "table2",
"attribute": "field1"
},
"target": {
"database": "bq_project",
"schema": "bq_dataset2",
"relation": "bq_table2",
"attribute": "bq_field"
}
}, {
"source": {
"type": "ATTRIBUTE_ALIAS",
"database": "project",
"schema": "dataset2",
"relation": "table2",
"attribute": "field1"
},
"target": {
"database": "bq_project",
"schema": "bq_dataset2",
"relation": "bq_table2",
"attribute": "bq_field"
}
}]
}