Controla cambios de esquema a tablas de datos de exportación de BigQuery

En esta página, se aborda cómo manejar los cambios del esquema realizados el 28 de octubre de 2020 a los datos de Facturación de Cloud que se exportan a las tablas en BigQuery.

Comprende los cambios

El esquema de la tabla para los datos del costo de uso estándar de la Facturación de Cloud exportados a BigQuery se actualizó a fin de proporcionar más claridad con campos de datos adicionales. Esta tabla se llama gcp_billing_export_v1_<BILLING_ACCOUNT_ID> en el conjunto de datos de BigQuery.

Se agregaron los siguientes campos de datos al esquema de exportación de uso de BigQuery de la Facturación de Cloud:

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

Estos datos son nuevos a partir del 29 de octubre de 2020 y no están disponibles para el uso de datos registrado antes de esa fecha. Actualiza tus integraciones o automatizaciones en función del esquema nuevo. Para ello, realiza migraciones, si es necesario. Para obtener información sobre los datos que proporcionan estos campos nuevos, consulta Comprende las tablas de datos de la Facturación de Cloud en BigQuery.

Impacto en las tablas y consultas existentes

Debido a que la estructura de la tabla para la exportación de datos del costo de uso estándar cambió, cualquier consulta que hace referencia directa a las tablas exportadas ya no te proporciona todos los datos disponibles. Para resolver esto, recomendamos crear vistas de BigQuery que consulten las tablas exportadas y presenten la información en tu estructura preferida. Luego, puedes ajustar las consultas que realizan el feed de tus informes y paneles para extraer de las vistas, en lugar de las tablas exportadas.

Con las vistas, puedes estandarizar la estructura de los datos que se usan en las consultas y los paneles.

Las vistas que crees deben normalizar los datos para que todas las tablas relevantes presenten el mismo esquema a tus consultas. Esto te protege de cambios de esquema futuros, lo que te permite modificar la consulta subyacente de la vista en esas instancias cuando cambia el esquema de datos.

Crea vistas para manejar los cambios de esquema

Si necesitas conservar las tablas que usan el esquema anterior, te recomendamos crear vistas de BigQuery para esas tablas a fin de normalizar el esquema de datos. Cuando creas una vista para migrar del esquema anterior al nuevo, puedes usar una declaración UNION a fin de combinar tablas con esquemas no coincidentes. La vista que crees dependerá de los campos de datos que uses en tus consultas y paneles.

Uno o más de los siguientes ejemplos pueden aplicarse a tu situación, en la que tus consultas pueden o no usar los nuevos campos project.number y adjustment_info.

  1. Usa tablas que incluyan propiedades de esquema preexistentes y nuevas, como credits.type, credits.id, credits.full, project.number y adjustment_info. Si deseas ver un ejemplo de cómo crear esta vista, consulta Crea una vista para tablas con todos los campos del esquema actualizado.
  2. Usa tablas que no incluyan las propiedades de esquema preexistentes credits.type, credits.id y credits.full. Si deseas ver un ejemplo de cómo crear esta vista, consulta la sección sobre cómo crear una vista para tablas sin credits.type, credits.id ni credits.full.
  3. Usas tablas que incluyen las propiedades de esquema preexistentes credits.type, credits.id y credits.full, pero no incluyen las propiedades de esquema nuevas project.number y adjustment_info. Si deseas ver un ejemplo de cómo crear esta vista, consulta la sección sobre cómo crear una vista para tablas sin project.number ni adjustment_info.

Puedes crear una vista; para ello, redacta una consulta de SQL que se use con el fin de definir los datos a los que puede acceder la vista. Para obtener más información, consulta Crea vistas.

A continuación, se presenta un resumen de los pasos para crear una vista de BigQuery.

  1. Selecciona la consulta para crear la vista
  2. Ejecuta la consulta y observa los resultados
  3. Guarda la vista
  4. Ingresa el nombre de la vista nueva
  5. Observa el esquema de la vista nueva

1. Crea una vista para tablas con todos los campos del esquema actualizado

La siguiente es una consulta que creará una vista nueva con los esquemas preexistentes y actualizados. Este tipo de vista limita la exposición a cambios de esquemas futuros.

Si usas esta vista para tus consultas, todas tendrán el mismo esquema y permitirán que las declaraciones UNION funcionen de forma correcta. Esta consulta conserva los campos y valores credits.type, credits.id, credits.full, project.number y adjustment_info de las tablas subyacentes.

SQL estándar

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. Crea una vista para tablas sin credits.type, credits.id ni credits.full

La siguiente es una consulta que creará una vista nueva con tablas queno incluyan las propiedades de esquema preexistentes credits.type, credits.id y credits.full.

SQL estándar

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. Crea una vista para tablas sin project.number ni adjustment_info.

La siguiente es una consulta que creará una vista nueva mediante tablas que incluyen las propiedades de esquema preexistentes credits.type, credits.id y credits.full, pero no incluye las nuevas propiedades de esquema project.number y adjustment_info.

SQL estándar

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. Verifica que las vistas sean coherentes con las tablas originales

Las siguientes consultas te permiten verificar que las vistas que creaste proporcionen datos coherentes con las tablas originales que estabas consultando. Las consultas usan la vista creada en el ejemplo sin credits.type, credits.id ni credits.full. Para obtener detalles sobre cómo crear esta vista, consulta Crea una vista para tablas sin credits.type, credits.id ni credits.full.

Esta consulta proporciona una comparación por fila del costo entre la tabla original y la vista creada sin credits.type, credits.id ni credits.full.

SQL estándar

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

Esta consulta proporciona una comparación por fila de créditos entre la tabla original y la vista creada sin credits.type, credits.id ni credits.full.

SQL estándar

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