Gestire le modifiche allo schema nelle tabelle di dati di esportazione di BigQuery

In questa pagina viene spiegato come gestire le modifiche allo schema apportate il 28 ottobre 2020 ai dati di fatturazione Cloud esportati nelle tabelle in BigQuery.

Comprendere le modifiche

Lo schema della tabella per i dati di costo standard dell'utilizzo del fatturazione Cloud esportato in BigQuery è stato aggiornato per garantire una maggiore chiarezza con campi di dati aggiuntivi. Questa tabella è denominata gcp_billing_export_v1_<BILLING_ACCOUNT_ID> nel set di dati BigQuery.

Sono stati aggiunti i seguenti campi di dati allo schema di esportazione dell'utilizzo del fatturazione Cloud BigQuery:

  • project.number
  • adjustment_info
  • adjustment_info.id
  • adjustment_info.mode
  • adjustment_info.description
  • adjustment_info.type

Questi dati sono aggiornati al 29 ottobre 2020 e non sono disponibili per l'utilizzo dei dati registrato prima di allora. Aggiorna le integrazioni o le automazioni in base al nuovo schema eseguendo le migrazioni, se e quando necessario. Per informazioni sui dati forniti da questi nuovi campi, consulta Informazioni sulle tabelle di dati di fatturazione Cloud in BigQuery.

Impatto su tabelle e query esistenti

Poiché la struttura della tabella per l'esportazione dei dati del costo di utilizzo standard è cambiata, le query che fanno riferimento direttamente alle tabelle esportate non forniscono più tutti i dati disponibili. Per risolvere questo problema, ti consigliamo di creare viste BigQuery che eseguono query sulle tabelle esportate e presentano le informazioni nella struttura che preferisci. Puoi modificare le query che alimentano i report e le dashboard in modo da estrarre le viste anziché le tabelle esportate.

Utilizzando le viste, puoi standardizzare la struttura dei dati utilizzati nelle query e nelle dashboard.

Le viste che crei devono normalizzare i dati in modo che tutte le tabelle pertinenti presentino lo stesso schema per le query. Questo ti protegge dalle future modifiche allo schema, consentendoti di modificare la query sottostante della vista in quelle istanze quando cambia lo schema dei dati.

Creazione delle visualizzazioni per gestire le modifiche allo schema

Se hai bisogno di conservare le tabelle che utilizzano lo schema precedente, ti consigliamo di creare viste BigQuery per queste tabelle per normalizzare lo schema di dati. Quando crei una vista di cui eseguire la migrazione dallo schema precedente a quello nuovo, puoi utilizzare un'istruzione UNION per combinare tabelle con schemi non corrispondenti. La vista creata dipende dai campi di dati utilizzati nelle query e nelle dashboard.

Uno o più degli esempi riportati di seguito potrebbero essere applicabili alla tua situazione, per cui le query potrebbero utilizzare o meno i nuovi campi project.number e adjustment_info.

  1. Puoi utilizzare le tabelle che includono proprietà di schema preesistenti e nuove, come credits.type, credits.id, credits.full, project.number e adjustment_info. Per un esempio di come creare questa vista, consulta Creazione di una vista per tabelle con tutti i campi nello schema aggiornato.
  2. Le tabelle che non includono le proprietà schema preesistenti, credits.type, credits.id e credits.full. Per un esempio di come creare questa vista, consulta Creazione di una vista per tabelle senza credits.type, credits.id e credits.full.
  3. Le tabelle che includono proprietà di schema preesistenti credits.type, credits.id e credits.full, non includono le nuove proprietà di schema project.number e adjustment_info. Per un esempio di come creare questa vista, consulta Creazione di una vista per tabelle senza project.number e adjustment_info.

Per creare una vista, puoi scrivere una query SQL che utilizzi per definire i dati a cui puoi accedere. Per ulteriori dettagli, consulta Creazione di una vista.

Di seguito è riportato un riepilogo dei passaggi da seguire per creare una visualizzazione di BigQuery.

  1. Seleziona la query per creare la vista
  2. Esegui la query e osserva i risultati
  3. Salvare la visualizzazione
  4. Inserisci il nome della nuova visualizzazione
  5. Osserva lo schema della nuova visualizzazione

1. Creazione di una vista per le tabelle con tutti i campi nello schema aggiornato

Di seguito è una query che creerà una nuova vista utilizzando gli schemi preesistenti e aggiornati. Questo tipo di visualizzazione limita l'esposizione a future modifiche allo schema.

Utilizzando questa vista per le tue query, tutte avranno lo stesso schema e consentiranno alle istruzioni di UNION di funzionare correttamente. Questa query conserva i campi credits.type e credits.id, credits.full, project.number e adjustment_info dalle tabelle sottostanti.

SQL standard

SELECT
    billing_account_id,
    STRUCT(service.id as id,
        service.description as description) as service,
    STRUCT(sku.id as id,
        sku.description as description) as sku,
    usage_start_time,
    usage_end_time,
    STRUCT(
        project.id as id,
        project.name as name,
        project.number as number,
        ARRAY(SELECT AS STRUCT
            label.key as key,
            label.value as value,
            FROM UNNEST(project.labels) as label) as labels,
        project.ancestry_numbers as ancestry_numbers) as project,
    ARRAY(SELECT AS STRUCT
        label.key as key,
        label.value as value,
        FROM UNNEST(labels) as label) as labels,
    ARRAY(SELECT AS STRUCT
        system_label.key as key,
        system_label.value as value,
        FROM UNNEST(system_labels) as system_label) as system_labels,
    STRUCT(
        location.location as location,
        location.country as country,
        location.region as region,
        location.zone as zone) as location,
    export_time,
    cost,
    currency,
    currency_conversion_rate,
    STRUCT(
        usage.amount as amount,
        usage.unit as unit,
        usage.amount_in_pricing_units as amount_in_pricing_units,
        usage.pricing_unit as pricing_unit) as usage,
    ARRAY(SELECT AS STRUCT
        credit.name as name,
        credit.amount as amount,
        credit.type as type,
        credit.id as id,
        credit.full_name as full_name,
        FROM UNNEST(credits) as credit) as credits,
    STRUCT(
        invoice.month as month) as invoice,
    cost_type,
    STRUCT(
        adjustment_info.id as id,
        adjustment_info.description as description,
        adjustment_info.mode as mode,
        adjustment_info.type as type) as adjustment_info,
    FROM TABLE_WITH_CREDITINFO_PROJECT_NUMBER_AND_ADJUSTMENT_INFO

2. Creazione di una vista per le tabelle senza credits.type, credits.id e credits.full

Di seguito è riportata una query che creerà una nuova vista utilizzando tabelle che non includono le proprietà schema preesistenti credits.type, credits.id e credits.full.

SQL standard

SELECT
    billing_account_id,
    STRUCT(service.id as id,
        service.description as description) as service,
    STRUCT(sku.id as id,
        sku.description as description) as sku,
    usage_start_time,
    usage_end_time,
    STRUCT(
        project.id as id,
        project.name as name,
        CAST(NULL as string) as number,
        ARRAY(SELECT AS STRUCT
            label.key as key,
            label.value as value,
            FROM UNNEST(project.labels) as label) as labels,
        project.ancestry_numbers as ancestry_numbers) as project,
    ARRAY(SELECT AS STRUCT
        label.key as key,
        label.value as value,
        FROM UNNEST(labels) as label) as labels,
    ARRAY(SELECT AS STRUCT
        system_label.key as key,
        system_label.value as value,
        FROM UNNEST(system_labels) as system_label) as system_labels,
    STRUCT(
        location.location as location,
        location.country as country,
        location.region as region,
        location.zone as zone) as location,
    export_time,
    cost,
    currency,
    currency_conversion_rate,
    STRUCT(
        usage.amount as amount,
        usage.unit as unit,
        usage.amount_in_pricing_units as amount_in_pricing_units,
        usage.pricing_unit as pricing_unit) as usage,
    ARRAY(SELECT AS STRUCT
        credit.name as name,
        credit.amount as amount,
        CAST(NULL as STRING) as type,
        CAST(NULL as STRING) as id,
        CAST(NULL as STRING) as full_name,
        FROM UNNEST(credits) as credit) as credits,
    STRUCT(
        invoice.month as month) as invoice,
    cost_type,
    STRUCT(
        CAST(NULL as STRING) as id,
        CAST(NULL as STRING) as description,
        CAST(NULL as STRING) as mode,
        CAST(NULL as STRING) as type) as adjustment_info,
FROM TABLE_WITHOUT_CREDIT_ID_TYPE_FULL_NAME

3. Creazione di una vista per le tabelle senza project.number e adjustment_info

Di seguito è una query che creerà una nuova vista utilizzando tabelle che includono le proprietà di schema preesistenti credits.type, credits.id e credits.full, ma non le nuove proprietà di schema project.number e adjustment_info.

SQL standard

SELECT
    billing_account_id,
    STRUCT(service.id as id,
        service.description as description) as service,
    STRUCT(sku.id as id,
        sku.description as description) as sku,
    usage_start_time,
    usage_end_time,
    STRUCT(
        project.id as id,
        project.name as name,
        CAST(NULL as string) as number,
        ARRAY(SELECT AS STRUCT
            label.key as key,
            label.value as value,
            FROM UNNEST(project.labels) as label) as labels,
        project.ancestry_numbers as ancestry_numbers) as project,
    ARRAY(SELECT AS STRUCT
        label.key as key,
        label.value as value,
        FROM UNNEST(labels) as label) as labels,
    ARRAY(SELECT AS STRUCT
        system_label.key as key,
        system_label.value as value,
        FROM UNNEST(system_labels) as system_label) as system_labels,
    STRUCT(
        location.location as location,
        location.country as country,
        location.region as region,
        location.zone as zone) as location,
    export_time,
    cost,
    currency,
    currency_conversion_rate,
    STRUCT(
        usage.amount as amount,
        usage.unit as unit,
        usage.amount_in_pricing_units as amount_in_pricing_units,
        usage.pricing_unit as pricing_unit) as usage,
    ARRAY(SELECT AS STRUCT
        credit.name as name,
        credit.amount as amount,
        credit.type as type,
        credit.id as id,
        credit.full_name as full_name,
        FROM UNNEST(credits) as credit) as credits,
    STRUCT(
        invoice.month as month) as invoice,
    cost_type,
    STRUCT(
        CAST(NULL as STRING) as id,
        CAST(NULL as STRING) as description,
        CAST(NULL as STRING) as mode,
        CAST(NULL as STRING) as type) as adjustment_info,
FROM TABLE_WITHOUT_PROJECTNUMBER_AND_ADJUSTMENT_INFO

4. Verificare che le viste siano coerenti con le tabelle originali

Le seguenti query consentono di verificare che le viste che hai creato forniscano dati coerenti con le tabelle originali su cui hai eseguito la query. Le query utilizzano la vista creata nell'esempio senza credits.type, credits.id e credits.full. Per informazioni dettagliate su come creare questa vista, consulta Creazione di una vista per tabelle senza credits.type, credits.id e credits.full.

Questa query offre un confronto riga per riga del costo tra la tabella originale e la visualizzazione creata senza credits.type, credits.id e credits.full.

SQL standard

-- ROW BY ROW COMPARISON OF COST BETWEEN ORIGINAL TABLE AND CONVERTED TABLE
SELECT cost FROM TABLE_WITHOUT_CREDIT_ID_TYPE_FULL_NAME
EXCEPT DISTINCT
SELECT cost FROM TABLE_WITHOUT_CREDIT_ID_TYPE_FULL_NAME_VIEW

Questa query fornisce un confronto riga per riga dei crediti tra la tabella originale e la vista creata senza credits.type, credits.id e credits.full.

SQL standard

-- ROW BY ROW COMPARISON OF CREDITS BETWEEN ORIGINAL TABLE AND CONVERTED TABLE
WITH CONCAT_AMOUNTS AS (SELECT ARRAY_CONCAT_AGG(ARRAY(SELECT amount FROM UNNEST(credits) as cred)) as amounts FROM TABLE_WITHOUT_CREDIT_ID_TYPE_FULL_NAME),
CONCAT_AMOUNTS_CONVERTED AS (SELECT ARRAY_CONCAT_AGG(ARRAY(SELECT amount FROM UNNEST(credits) as cred)) as amounts FROM TABLE_WITHOUT_CREDIT_ID_TYPE_FULL_NAME_VIEW)

SELECT amounts FROM CONCAT_AMOUNTS, UNNEST(amounts) as amounts
EXCEPT DISTINCT
SELECT amounts FROM CONCAT_AMOUNTS_CONVERTED, UNNEST(amounts) as amounts