Umgang mit Schemaänderungen an BigQuery-Exportdatentabellen

Auf dieser Seite wird der Umgang mit den am 28. Oktober 2020 vorgenommenen Änderungen an den Cloud Billing-Daten erläutert, die in Tabellen in BigQuery exportiert werden.

Erläuterung der Änderungen

Das Tabellenschema für die nach BigQuery exportierten Standardnutzungskosten in Cloud Billing wurde aktualisiert, um weitere Datenfelder zu verdeutlichen. Die Tabelle heißt im BigQuery-Dataset gcp_billing_export_v1_<BILLING_ACCOUNT_ID>.

Die folgenden Datenfelder wurden dem Cloud Billing-BigQuery-Nutzungsexportschema hinzugefügt:

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

Diese Daten gelten ab dem 29. Oktober 2020 und sind nicht für aufgezeichnete Datennutzungen vor diesem Zeitpunkt verfügbar. Aktualisieren Sie bei Bedarf die Integrationen oder Automatisierungen auf Basis des neuen Schemas, indem Sie Migrationen ausführen. Informationen zu den Daten, die diese neuen Felder enthalten, finden Sie unter Cloud Billing-Datentabellen in BigQuery.

Auswirkungen auf vorhandene Tabellen und Abfragen

Da sich die Tabellenstruktur für den Export der Standardnutzungskosten geändert hat, enthalten Abfragen, die direkt auf die exportierten Tabellen verweisen, nicht mehr alle verfügbaren Daten. Zur Behebung dieses Problems empfehlen wir, BigQuery-Ansichten zu erstellen, die die exportierten Tabellen abfragen und die Informationen in Ihrer bevorzugten Struktur anzeigen. Anschließend können Sie die Abfragen, die Ihre Berichte und Dashboards speisen, anstelle der exportierten Tabellen anpassen.

Mit Ansichten können Sie die Struktur der in Ihren Abfragen und Dashboards verwendeten Daten standardisieren.

In den von Ihnen erstellten Ansichten sollten die Daten normalisiert werden, sodass alle relevanten Tabellen in Ihren Abfragen das gleiche Schema enthalten. Somit sind Sie vor zukünftigen Schemaänderungen geschützt und können die zugrunde liegende Abfrage in diesen Instanzen ändern, wenn sich das Datenschema ändert.

Ansichten für den Umgang mit Schemaänderungen erstellen

Wenn Sie Tabellen beibehalten müssen, die das vorherige Schema verwenden, sollten Sie BigQuery-Ansichten für diese Tabellen erstellen, um das Datenschema zu normalisieren. Wenn Sie eine Ansicht zum Migrieren vom vorherigen Schema zum neuen erstellen, können Sie eine UNION-Anweisung verwenden, um Tabellen mit nicht übereinstimmenden Schemas zu kombinieren. Die zu erstellende Ansicht hängt von den Datenfeldern ab, die Sie in Ihren Abfragen und Dashboards verwenden.

Mindestens eines der folgenden Beispiele kann auf Ihre Situation zutreffen, wobei Ihre Abfragen die neuen Felder project.number und adjustment_info möglicherweise nicht verwenden.

  1. Sie verwenden Tabellen, die bereits vorhandene und neue Schemaattribute enthalten, z. B. credits.type, credits.id, credits.full, project.number und adjustment_info. Ein Beispiel für das Erstellen dieser Ansicht finden Sie unter Ansicht für Tabellen mit allen Feldern im aktualisierten Schema erstellen.
  2. Sie verwenden Tabellen, die nicht die vorhandenen Schemaattribute credits.type, credits.id und credits.full enthalten. Ein Beispiel für das Erstellen dieser Ansicht finden Sie unter Ansicht für Tabellen ohne credits.type, credits.id und credits.full erstellen.
  3. Sie verwenden Tabellen, die die vorhandenen Schemaattribute credits.type, credits.id und credits.full enthalten, jedoch nicht die neuen Schemaattribute project.number und adjustment_info. Ein Beispiel für das Erstellen dieser Ansicht finden Sie unter Ansicht für Tabellen ohne project.number und adjustment_info erstellen.

Sie können eine Ansicht erstellen, indem Sie eine SQL-Abfrage verfassen, mit der die für die Ansicht zugänglichen Daten definiert werden. Weitere Informationen finden Sie unter Ansicht erstellen.

Im Folgenden werden die Schritte zum Erstellen einer BigQuery-Ansicht zusammengefasst.

  1. Die Abfrage zum Erstellen der Ansicht auswählen
  2. Die Abfrage ausführen und Ergebnisse beobachten
  3. Die Ansicht speichern
  4. Den Namen für die neue Datenansicht eingeben
  5. Das Schema der neuen Ansicht beobachten

1. Ansicht für Tabellen mit allen Feldern im aktualisierten Schema erstellen

Mit der folgenden Abfrage wird eine neue Ansicht mit bereits vorhandenen und aktualisierten Schemas erstellt. MIt dieser Ansicht sinkt die Gefahr zukünftiger Schemaänderungen.

Wenn Sie diese Ansicht für Ihre Abfragen verwenden, haben sie alle das gleiche Schema und ermöglichen die erfolgreiche Funktionsweise von UNION-Anweisungen. Diese Abfrage behält die Felder credits.type, credits.id, credits.full, project.number und adjustment_info in den zugrunde liegenden Tabellen bei.

Standard-SQL

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. Ansicht für Tabellen ohne credits.type, credits.id und credits.full erstellen

Die folgende Abfrage erstellt eine neue Ansicht mithilfe von Tabellen, die nicht die bereits vorhandenen Schemaattribute credits.type ,credits.id und credits.full enthalten.

Standard-SQL

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. Ansicht für Tabellen ohne project.number und adjustment_info erstellen

Die folgende Abfrage erstellt eine neue Ansicht mithilfe von Tabellen, die zwar die bereits vorhandenen Schemaattribute credits.type, credits.id und credits.full enthalten, jedoch nicht die neuen Schemaattribute project.number und adjustment_info.

Standard-SQL

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. Prüfen, ob Ansichten mit Originaltabellen übereinstimmen

Mit den folgenden Abfragen können Sie überprüfen, ob die von Ihnen erstellten Ansichten Daten bereitstellen, die mit den abgefragten ursprünglichen Tabellen übereinstimmen. Die Abfragen verwenden die im Beispiel erstellte Ansicht ohne credits.type, credits.id und credits.full. Weitere Informationen zum Erstellen dieser Ansicht finden Sie unter Ansicht für Tabellen ohne credits.type, credits.id und credits.full erstellen.

Diese Abfrage bietet einen Vergleich der Kosten zwischen der ursprünglichen Tabelle und der Ansicht, die ohne credits.type, credits.id und credits.full erstellt wurde. Dabei werden alle Zeilen einzeln verglichen.

Standard-SQL

-- 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

Diese Abfrage bietet einen Vergleich der Guthaben zwischen der ursprünglichen Tabelle und der Ansicht, die ohne credits.type, credits.id und credits.full erstellt wurde. Dabei werden alle Zeilen einzeln verglichen.

Standard-SQL

-- 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