Trasforma le traduzioni SQL utilizzando i file YAML di configurazione

Questo documento mostra come utilizzare i file YAML di configurazione per trasformare le query durante la migrazione a BigQuery. Fornisce linee guida per creare i tuoi file YAML di configurazione e fornire esempi per vari trasformazioni di traduzione supportate da questa funzionalità.

Quando utilizzi lo strumento BigQuery traduttore SQL interattivo o eseguire una traduzione SQL batch, puoi fornire file YAML di configurazione per modificare una traduzione di query SQL. L'uso dei file YAML di configurazione consente un'ulteriore personalizzazione quando e tradurre le query SQL dal database di origine.

Puoi specificare un file YAML di configurazione da utilizzare in una traduzione SQL nel nei seguenti modi:

il traduttore SQL interattivo, il traduttore SQL batch e il client Python di traduzione batch supporta l'utilizzo di più file YAML di configurazione in un singolo job di traduzione. Consulta Applicazione di più configurazioni YAML per ulteriori informazioni.

Requisiti del file YAML di configurazione

Prima di creare un file YAML di configurazione, esamina le seguenti informazioni per assicurarti che il tuo file YAML sia compatibile per l'utilizzo BigQuery Migration Service:

  • Devi caricare i file YAML di configurazione nella directory principale del Bucket Cloud Storage che contiene i file di input della traduzione SQL. Per informazioni su come creare bucket e caricare file su Cloud Storage, consulta Creare bucket e Caricare oggetti da un file system.
  • Le dimensioni di un singolo file YAML di configurazione non devono superare 1 MB.
  • Le dimensioni totali di tutti i file YAML di configurazione utilizzati in una singola query il job di traduzione non deve superare i 4 MB.
  • Se utilizzi la sintassi regex per la corrispondenza dei nomi, usa RE2/J.
  • Tutti i nomi dei file YAML di configurazione devono includere un .config.yaml, ad esempio change-case.config.yaml.
    • config.yaml da solo non è un nome valido per il file di configurazione.

Linee guida per creare un file YAML di configurazione

Questa sezione fornisce alcune linee guida generali per creare un file YAML di configurazione file:

Ogni file di configurazione deve contenere un'intestazione che specifichi il tipo configurazione. Il tipo object_rewriter viene utilizzato per specificare le traduzioni SQL in di configurazione YAML. L'esempio seguente utilizza object_rewriter per trasformare un nome in maiuscolo:

type: object_rewriter
global:
  case:
    all: UPPERCASE

Selezione entità

Per eseguire trasformazioni specifiche dell'entità, specifica l'entità nel di configurazione del deployment. Tutte le proprietà match sono facoltative; usa solo match necessarie per una trasformazione. Il seguente file YAML di configurazione mostra le proprietà da abbinare per selezionare entità specifiche:

match:
  db: <literal_name>
  schema: <literal_name>
  relation: <literal_name>
  attribute: <literal_name>
  dbRegex: <regex>
  schemaRegex: <regex>
  relationRegex: <regex>
  attributeRegex: <regex>

Descrizione di ogni proprietà match:

  • db: il componente project_id.
  • schema: il componente del set di dati.
  • relation: il componente della tabella.
  • attribute: il componente della colonna. Valido solo per la selezione dell'attributo
  • dbRegex: corrisponde a una proprietà db con un'espressione regolare (Anteprima).
  • schemaRegex: associa le proprietà schema alle espressioni regolari (anteprima).
  • relationRegex: associa le proprietà relation con le espressioni regolari (anteprima).
  • attributeRegex: abbina attribute proprietà con la normale le espressioni regolari. Valido solo per la selezione degli attributi (Anteprima).

Ad esempio, il seguente YAML di configurazione specifica il match proprietà per selezionare la tabella testdb.acme.employee per una tabella temporanea e la trasformazione dei dati.

type: object_rewriter
relation:
-
  match:
    db: testdb
    schema: acme
    relation: employee
  temporary: true

Puoi utilizzare dbRegex, schemaRegex, relationRegex e attributeRegex per specificare espressioni regolari in modo da selezionare un sottoinsieme di le entità. L'esempio seguente modifica tutti dallo schema tmp_schema in testdb a quello temporaneo, purché il nome inizia con tmp_:

type: object_rewriter
relation:
-
  match:
    schema: tmp_schema
    relationRegex: "tmp_.*"
  temporary: true

Sia le proprietà letterali che regex vengono associate senza distinzione tra maiuscole e minuscole. Puoi applicare la corrispondenza sensibile alle maiuscole utilizzando un elemento regex con un i disattivato come illustrato nell'esempio seguente:

match:
  relationRegex: "(?-i:<actual_regex>)"

Puoi anche specificare entità qualificate utilizzando una stringa corta equivalente a riga di comando. Una sintassi a stringa corta prevede esattamente tre (per la selezione delle relazioni) o quattro (per la selezione degli attributi) nome segmenti delimitati da punti, come esempio testdb.acme.employee. I segmenti vengono poi interpretati internamente come se sono state superate rispettivamente come db, schema, relation e attribute. Ciò significa che i nomi vengono abbinati letteralmente, quindi le espressioni regolari non vengono consentiti nella sintassi breve. L'esempio seguente mostra l'utilizzo di stringhe brevi per specificare un'entità valida in un file YAML di configurazione:

type: object_rewriter
relation:
-
  match : "testdb.acme.employee"
  temporary: true

Se il nome di una tabella contiene un punto, non puoi specificarlo utilizzando un breve a riga di comando. In questo caso, devi utilizzare una corrispondenza dell'oggetto. Nell'esempio che segue cambia la tabella testdb.acme.stg.employee in temporanea:

type: object_rewriter
relation:
-
  match:
    db: testdb
    schema: acme
    relation: stg.employee
  temporary: true

La configurazione YAML accetta key come alias per match.

Database predefinito

Alcuni dialetti SQL di input, in particolare Teradata, non supportano database-name nella nome qualificato. In questo caso, il modo più semplice per creare una corrispondenza tra le entità è omettere db proprietà in match.

Tuttavia, puoi impostare la proprietà default_database di BigQuery Migration Service e utilizza quel database predefinito in match.

Tipi di attributi target supportati

Puoi usare il file YAML di configurazione per eseguire il tipo di attributo trasformazioni, in cui trasformerai tipo di dati di una colonna dal tipo di origine a un tipo target. La di configurazione YAML supporta i seguenti tipi di destinazione:

  • BOOLEAN
  • TINYINT
  • SMALLINT
  • INTEGER
  • BIGINT
  • FLOAT
  • DOUBLE
  • NUMERIC (supporta precisione e scala facoltative, ad esempio NUMERIC(18, 2))
  • TIME
  • TIMETZ
  • DATE
  • DATETIME
  • TIMESTAMP
  • TIMESTAMPTZ
  • CHAR (supporta la precisione facoltativa, ad esempio CHAR(42))
  • VARCHAR (supporta la precisione facoltativa, ad esempio VARCHAR(42))

Esempi YAML di configurazione

Questa sezione fornisce esempi per creare vari file YAML di configurazione con le traduzioni SQL. Ogni esempio illustra la sintassi YAML trasformare la traduzione SQL in modi specifici, insieme a una breve descrizione. Ogni esempio fornisce anche i contenuti di un elemento teradata-input.sql hive-input.sql e un file bq-output.sql per confrontare effetti di un file YAML di configurazione su una query SQL di BigQuery una traduzione automatica.

I seguenti esempi utilizzano Teradata o Hive come SQL di input e BigQuery SQL come dialetto di output. Le seguenti esempi utilizzano anche testdb come database predefinito e testschema come del percorso di ricerca schema.

Modifica maiuscole/minuscole del nome oggetto

Il seguente codice YAML di configurazione modifica le maiuscole/minuscole superiori o inferiori dell'oggetto nomi:

type: object_rewriter
global:
  case:
    all: UPPERCASE
    database: LOWERCASE
    attribute: LOWERCASE

Una traduzione SQL con questo file YAML di configurazione potrebbe essere simile seguenti:

teradata-input.sql
      create table x(a int);
      select * from x;
    
bq-output.sql
      CREATE TABLE testdb.TESTSCHEMA.X
      (
        a INT64
      )
      ;
      SELECT
          X.a
        FROM
          testdb.TESTSCHEMA.X
      ;
    

Imposta tabella temporanea

Il seguente YAML di configurazione modifica una tabella normale in una tabella:

type: object_rewriter
relation:
  -
    match: "testdb.testschema.x"
    temporary: true

Una traduzione SQL con questo file YAML di configurazione potrebbe essere simile seguenti:

teradata-input.sql
    create table x(a int);
    
bq-output.sql
    CREATE TEMPORARY TABLE x
    (
      a INT64
    )
    ;
    

Imposta la tabella come temporanea

Il seguente codice YAML di configurazione modifica una tabella normale in un tempo temporaneo tabella con un Scadenza 60 secondi.

type: object_rewriter
relation:
  -
    match: "testdb.testschema.x"
    ephemeral:
      expireAfterSeconds: 60

Una traduzione SQL con questo file YAML di configurazione potrebbe essere simile seguenti:

teradata-input.sql
    create table x(a int);
    
bq-output.sql
    CREATE TABLE testdb.testschema.x
    (
      a INT64
    )
    OPTIONS(
      expiration_timestamp=timestamp_add(current_timestamp(), interval 60 SECOND)
    );
    

Imposta scadenza della partizione

Il seguente YAML di configurazione modifica la scadenza di un tabella su 1 giorno:

type: object_rewriter
relation:
  -
    match: "testdb.testschema.x"
    partitionLifetime:
      expireAfterSeconds: 86400

Una traduzione SQL con questo file YAML di configurazione potrebbe essere simile seguenti:

teradata-input.sql
    create table x(a int, b int) partition by (a);
    
bq-output.sql
    CREATE TABLE testdb.testschema.x
    (
      a INT64,
      b INT64
    )
    CLUSTER BY a
    OPTIONS(
      partition_expiration_days=1
    );
    

Modificare la posizione o il formato esterno di una tabella

Il seguente codice YAML di configurazione modifica la posizione esterna e la configurazione per una tabella:

type: object_rewriter
relation:
  -
    match: "testdb.testschema.x"
    external:
      locations: "gs://path/to/department/files"
      format: ORC

Una traduzione SQL con questo file YAML di configurazione potrebbe essere simile seguenti:

teradata-input.sql
    create table x(a int);
    
bq-output.sql
    CREATE EXTERNAL TABLE testdb.testschema.x
    (
      a INT64
    )
    OPTIONS(
      format='ORC',
      uris=[
        'gs://path/to/department/files'
      ]
    );
    

Imposta o modifica la descrizione della tabella

Il seguente YAML di configurazione imposta la descrizione di una tabella:

type: object_rewriter
relation:
  -
    match: "testdb.testschema.x"
    description:
      text: "Example description."

Una traduzione SQL con questo file YAML di configurazione potrebbe essere simile seguenti:

teradata-input.sql
    create table x(a int);
    
bq-output.sql
    CREATE TABLE testdb.testschema.x
    (
      a INT64
    )
    OPTIONS(
      description='Example description.'
    );
    

Imposta o modifica il partizionamento delle tabelle

Il seguente codice YAML di configurazione modifica lo schema di partizionamento di una tabella:

type: object_rewriter
relation:
  -
    match: "testdb.testschema.x"
    partition:
      simple:
        add: [a]
  -
    match: "testdb.testschema.y"
    partition:
      simple:
        remove: [a]

Una traduzione SQL con questo file YAML di configurazione potrebbe essere simile seguenti:

teradata-input.sql
    create table x(a date, b int);
    create table y(a date, b int) partition by (a);
    
bq-output.sql
    CREATE TABLE testdb.testschema.x
    (
      a DATE,
      b INT64
    )
    PARTITION BY a;
    CREATE TABLE testdb.testschema.y
    (
      a DATE,
      b INT64
    )
    ;
    

Imposta o modifica il clustering delle tabelle

Il seguente codice YAML di configurazione modifica lo schema di clustering di una tabella:

type: object_rewriter
relation:
  -
    match: "testdb.testschema.x"
    clustering:
      add: [a]
  -
    match: "testdb.testschema.y"
    clustering:
      remove: [b]

Una traduzione SQL con questo file YAML di configurazione potrebbe essere simile seguenti:

hive-input.sql
    create table x(a int, b int);
    create table y(a int, b int) clustered by (b) into 16 buckets;
    
bq-output.sql
    CREATE TABLE testdb.testschema.x
    (
      a INT64,
      b INT64
    )
    CLUSTER BY a;
    CREATE TABLE testdb.testschema.y
    (
      a INT64,
      b INT64
    )
    ;
    

Modificare il tipo di un attributo di colonna

Il seguente codice YAML di configurazione modifica il tipo di dati per un attributo di un colonna:

type: object_rewriter
attribute:
  -
    match:
      db: testdb
      schema: testschema
      attributeRegex: "a+"
    type:
      target: NUMERIC(10,2)

Puoi trasformare il tipo di dati di origine in uno qualsiasi dei tipi di attributi target supportati.

Una traduzione SQL con questo file YAML di configurazione potrebbe essere simile seguenti:

teradata-input.sql
    create table x(a int, b int, aa int);
    
bq-output.sql
    CREATE TABLE testdb.testschema.x
    (
      a NUMERIC(31, 2),
      b INT64,
      aa NUMERIC(31, 2)
    )
    ;
    

Aggiungi connessione a data lake esterno

Il seguente codice YAML di configurazione contrassegna la tabella di origine come esterna che punta a dati archiviati in un data lake esterno, specificati da un e la connessione al lake.

type: object_rewriter
relation:
-
  key: "testdb.acme.employee"
  external:
    connection_id: "connection_test"

Una traduzione SQL con questo file YAML di configurazione potrebbe essere simile seguenti:

hive-input.sql
    CREATE TABLE x
    (
      a VARCHAR(150),
      b INT
    );
    
bq-output.sql
    CREATE EXTERNAL TABLE x
    (
      a STRING,
      b INT64
    )
    WITH CONNECTION `connection_test`
    OPTIONS(
    );
    

Modificare la codifica dei caratteri di un file di input

Per impostazione predefinita, BigQuery Migration Service tenta di rilevare automaticamente della codifica dei caratteri dei file di input. Nei casi in cui BigQuery Migration Service potrebbero identificare erroneamente la codifica di un file, puoi utilizzare un file YAML per specificare la codifica dei caratteri in modo esplicito.

Il seguente YAML di configurazione specifica la codifica dei caratteri esplicita del file di input come ISO-8859-1.

type: experimental_input_formats
formats:
- source:
    pathGlob: "*.sql"
  contents:
    raw:
      charset: iso-8859-1

Conversione di tipo globale

Il seguente codice YAML della configurazione cambia un tipo di dati in un altro e specifica un tipo di dati di origine da evitare nello script sottoposto a transpile. È diverso da Modifica il tipo di attributo di una colonna. di configurazione, in cui viene modificato solo il tipo di dati per un singolo attributo.

BigQuery supporta le seguenti conversioni dei tipi di dati:

  • Da DATETIME a TIMESTAMP
  • Da TIMESTAMP a DATETIME
  • Da TIMESTAMP WITH TIME ZONE a DATETIME
  • Da CHAR a VARCHAR

Nell'esempio seguente, la configurazione YAML converte un DATETIME di dati a TIMESTAMP.

type: experimental_object_rewriter
global:
  typeConvert:
    timestamp: DATETIME

Una traduzione SQL con questo file YAML di configurazione potrebbe essere simile seguenti:

teradata-input.sql
      create table x(a timestamp);
    
bq-output.sql
      CREATE TABLE x
      (
        a TIMESTAMP
      )
      ;
    

Seleziona la modifica dell'istruzione

La configurazione YAML seguente modifica la proiezione a stella, GROUP BY e Clausole ORDER BY nelle istruzioni SELECT.

starProjection supporta le seguenti configurazioni:

  • ALLOW
  • PRESERVE (valore predefinito)
  • EXPAND

groupBy e orderBy supportano le seguenti configurazioni:

  • EXPRESSION
  • ALIAS
  • INDEX

Nell'esempio seguente, il codice YAML di configurazione configura proiezione in EXPAND.

type: experimental_statement_rewriter
select:
  starProjection: EXPAND

Una traduzione SQL con questo file YAML di configurazione potrebbe essere simile seguenti:

teradata-input.sql
      create table x(a int, b TIMESTAMP);
      select * from x;
    
bq-output.sql
      CREATE TABLE x
      (
        a INT64,
        b DATETIME
      )
      ;
      SELECT
          x.a
          x.b
        FROM
          x
      ;
    

Specifica della funzione definita dall'utente

Il seguente codice YAML di configurazione specifica la firma del file per le funzioni (UDF) utilizzate negli script di origine. Proprio come i file ZIP dei metadati, Le definizioni delle funzioni definite dall'utente possono aiutare a produrre una traduzione più accurata dell'input script.

type: metadata
udfs:
  - "date parse_short_date(dt int)"

Una traduzione SQL con questo file YAML di configurazione potrebbe essere simile seguenti:

teradata-input.sql
      create table x(dt int);
      select parse_short_date(dt) + 1 from x;
    
bq-output.sql
      CREATE TABLE x
      (
        dt INT64
      )
      ;
      SELECT
          date_add(parse_short_date(x.dt), interval 1 DAY)
        FROM
          x
      ;
    

Impostare la severità di precisione decimale

Per impostazione predefinita, BigQuery Migration Service aumenta la precisione numerica al valore massimo precisione disponibile per una data scala. Il seguente file YAML di configurazione sostituisce questo comportamento configurando la severità di precisione per la conservazione la precisione decimale dell'istruzione di origine.

type: experimental_statement_rewriter
common:
  decimalPrecision: STRICT

Una traduzione SQL con questo file YAML di configurazione potrebbe essere simile seguenti:

teradata-input.sql
      create table x(a decimal(3,0));
    
bq-output.sql
      CREATE TABLE x
      (
        a NUMERIC(3)
      )
      ;
    

Mappatura dei nomi di output

Puoi utilizzare YAML di configurazione per mappare i nomi degli oggetti SQL. Puoi modificare parti diverse del nome a seconda dell'oggetto da mappare.

Mapping dei nomi statico

Utilizza la mappatura dei nomi statica per mappare il nome di un'entità. Se vuoi solo modificare parti specifiche del nome, mantenendo invariate altre parti del nome, includi solo le parti che devono essere modificate.

Il seguente codice YAML di configurazione cambia il nome della tabella da Da my_db.my_schema.my_table a my_new_db.my_schema.my_new_table.

type: experimental_object_rewriter
relation:
-
  match: "my_db.my_schema.my_table"
  outputName:
    database: "my_new_db"
    relation: "my_new_table"

Una traduzione SQL con questo file YAML di configurazione potrebbe essere simile seguenti:

teradata-input.sql
      create table my_db.my_schema.my_table(a int);
    
bq-output.sql
      CREATE TABLE my_new_db.my_schema.my_new_table
      (
        a INT64
      )
    

Mappatura dinamica dei nomi

Utilizza la mappatura dinamica dei nomi per modificare più oggetti contemporaneamente e creare nuovi nomi basati sugli oggetti mappati.

Il seguente codice YAML di configurazione modifica il nome di tutte le tabelle aggiungendo il prefisso stg_ a quelli che appartengono allo schema staging e poi sposta questi elementi tabelle allo schema production.

type: experimental_object_rewriter
relation:
-
  match:
    schema: staging
  outputName:
    schema: production
    relation: "stg_${relation}"

Una traduzione SQL con questo file YAML di configurazione potrebbe essere simile seguenti:

teradata-input.sql
      create table staging.my_table(a int);
    
bq-output.sql
      CREATE TABLE production.stg_my_table
      (
        a INT64
      )
      ;
    

Specificare il database predefinito e il percorso di ricerca dello schema

Il seguente codice YAML di configurazione specifica un database predefinito e sul percorso di ricerca schema.

type: environment
session:
  defaultDatabase: myproject
  schemaSearchPath: [myschema1, myschema2]

Una traduzione SQL con questo file YAML di configurazione potrebbe essere simile seguenti:

teradata-input.sql
      SELECT * FROM database.table
      SELECT * FROM table1
    
bq-output.sql
      SELECT * FROM myproject.database.table.
      SELECT * FROM myproject.myschema1.table1
    

Riscrittura nome output globale

La configurazione YAML seguente modifica i nomi di output di tutti gli oggetti (database, schema, relazione e attributi) nello script secondo le regole configurate.

type: experimental_object_rewriter
global:
  outputName:
    regex:
      - match: '\s'
        replaceWith: '_'
      - match: '>='
        replaceWith: 'gte'
      - match: '^[^a-zA-Z_].*'
        replaceWith: '_$0'

Una traduzione SQL con questo file YAML di configurazione potrebbe essere simile seguenti:

teradata-input.sql
      create table "test special chars >= 12"("42eid" int, "custom column" varchar(10));
    
bq-output.sql
      CREATE TABLE test_special_chars_employees_gte_12
      (
        _42eid INT64,
        custom_column STRING
      )
      ;
    

Applicazione di più configurazioni YAML

Quando specifichi un file YAML di configurazione in un file SQL batch o interattivo puoi selezionare più file YAML di configurazione in un un job di traduzione per riflettere più trasformazioni. Se sono presenti più configurazioni conflitto, una trasformazione potrebbe prevalere su un'altra. È consigliabile utilizzare diversi tipi di impostazioni di configurazione in ogni file per evitare trasformazioni in conflitto nello stesso job di traduzione.

L'esempio seguente elenca due file YAML di configurazione separati per un singolo job di traduzione SQL, uno per modificare l'attributo di una colonna, e l'altra per impostare la tabella come temporanea:

change-type-example.config.yaml:

type: object_rewriter
attribute:
  -
    match: "testdb.testschema.x.a"
    type:
      target: NUMERIC(10,2)

make-temp-example.config.yaml:

type: object_rewriter
relation:
  -
    match: "testdb.testschema.x"
    temporary: true

Una traduzione SQL con questi due file YAML di configurazione potrebbe essere seguenti:

teradata-input.sql
    create table x(a int);
    
bq-output.sql
    CREATE TEMPORARY TABLE x
    (
      a NUMERIC(31, 2)
    )
    ;