Gérer les modifications du schéma des tables de données exportées dans BigQuery

Cette page explique comment gérer les modifications de schéma effectuées le 28 octobre 2020 sur les données Cloud Billing exportées vers les tables dans BigQuery.

Comprendre les modifications

Le schéma des tables pour les données de coût d'utilisation standard de Cloud Billing exportées vers BigQuery a été mis à jour afin de gagner en clarté grâce à des champs de données supplémentaires. Cette table est nommée gcp_billing_export_v1_<BILLING_ACCOUNT_ID> dans l'ensemble de données BigQuery.

Les champs de données suivants ont été ajoutés au schéma d'exportation des données d'utilisation BigQuery de Cloud Billing :

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

Ces données sont nouvellement disponibles depuis le 29 octobre 2020 et ne sont pas disponibles pour l'utilisation des données enregistrée avant cette date. Veuillez mettre à jour vos intégrations ou automatisations basées sur le nouveau schéma en effectuant des migrations, si nécessaire. Pour en savoir plus sur les données fournies par ces nouveaux champs, consultez la page Comprendre les tables de données Cloud Billing dans BigQuery.

Impact sur les tables et les requêtes existantes

Comme la structure des tables pour l'exportation des données de coût d'utilisation standard a changé, toutes les requêtes qui référencent directement les tables exportées ne vous fournissent plus l'intégralité des données disponibles. Pour résoudre ce problème, nous vous recommandons de créer des vues BigQuery qui interrogent les tables exportées et présentent les informations dans la structure de votre choix. Vous pouvez ensuite ajuster les requêtes qui alimentent vos rapports et tableaux de bord afin d'extraire les données des vues, et non les tables exportées.

Les vues vous permettent de standardiser la structure des données utilisées dans vos requêtes et vos tableaux de bord.

Les vues que vous créez doivent normaliser les données de sorte que toutes les tables pertinentes présentent le même schéma à vos requêtes. Cela vous protège des modifications de schéma futures en vous permettant de modifier la requête sous-jacente à la vue en cas de modifications du schéma de données.

Créer des vues pour gérer les modifications de schéma

Si vous devez conserver des tables qui utilisent le schéma précédent, nous vous recommandons de créer des vues BigQuery pour ces tables afin de normaliser le schéma de données. Lorsque vous créez une vue pour migrer du schéma précédent vers le nouveau, vous pouvez utiliser une instruction UNION afin de combiner des tables avec des schémas non concordants. La vue que vous créez dépend des champs de données que vous utilisez dans vos requêtes et tableaux de bord.

Un ou plusieurs des exemples suivants peuvent s'appliquer à votre situation, dans laquelle vos requêtes peuvent ou non utiliser les nouveaux champs project.number et adjustment_info.

  1. Vous utilisez des tables qui incluent des propriétés de schéma préexistantes et de nouvelles propriétés, telles que credits.type, credits.id, credits.full, project.number et adjustment_info. Pour obtenir un exemple de création de cette vue, consultez la section Créer une vue pour les tables avec tous les champs du schéma mis à jour.
  2. Vous utilisez des tables qui n'incluent pas les propriétés de schéma préexistantes credits.type, credits.id et credits.full. Pour obtenir un exemple de création de cette vue, consultez la section Créer une vue pour les tables sans credits.type, credits.id et credits.full.
  3. Vous utilisez des tables qui incluent les propriétés de schéma préexistantes credits.type, credits.id et credits.full, mais qui n'incluent pas les nouvelles propriétés de schéma project.number et adjustment_info. Pour obtenir un exemple de création de cette vue, consultez la section Créer une vue pour les tables sans project.number et adjustment_info.

Vous pouvez créer une vue en saisissant une requête SQL utilisée pour définir les données accessibles à la vue. Pour en savoir plus, consultez la section Créer une vue.

Voici un résumé des étapes à suivre pour créer une vue BigQuery.

  1. Sélectionner la requête utilisée pour créer la vue
  2. Exécuter la requête et observer les résultats
  3. Enregistrer la vue
  4. Saisir le nom de la nouvelle vue
  5. Observer le schéma de la nouvelle vue

1. Créer une vue pour les tables avec tous les champs du schéma mis à jour

La requête suivante permet de créer une nouvelle vue utilisant à la fois le schéma préexistant et le schéma mis à jour. Ce type de vue limite votre exposition aux modifications futures du schéma.

En utilisant cette vue pour vos requêtes, elles auront toutes le même schéma et permettront aux instructions UNION de fonctionner correctement. Cette requête conserve les champs et les valeurs credits.type, credits.id, credits.full, project.number et adjustment_info des tables sous-jacentes.

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. Créer une vue pour les tables sans credits.type, credits.id et credits.full

La requête suivante crée une vue à l'aide de tables qui n'incluent pas les propriétés de schéma préexistantes credits.type, credits.id et 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. Créer une vue pour les tables sans project.number et adjustment_info

Voici une requête qui crée une vue à l'aide de tables incluant les propriétés de schéma préexistantes credits.type, credits.id et credits.full, mais qui n'incluent pas les nouvelles propriétés de schéma project.number et 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. Vérifier la cohérence des vues avec les tables d'origine

Les requêtes suivantes vous permettent de vérifier que les vues que vous avez créées fournissent des données cohérentes avec les tables d'origine que vous interrogiez. Les requêtes utilisent la vue créée dans l'exemple sans credits.type, credits.id et credits.full. Pour en savoir plus sur la création de cette vue, consultez la section Créer une vue pour les tables sans credits.type, credits.id et credits.full.

Cette requête fournit une comparaison ligne par ligne du coût entre la table d'origine et la vue créée sans credits.type, credits.id et 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

Cette requête fournit une comparaison ligne par ligne des crédits entre la table d'origine et la vue créée sans credits.type, credits.id et 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