BigQuery 내보내기 데이터 테이블의 스키마 변경사항 처리

이 페이지에서는 2020년 10월 28일 BigQuery의 테이블로 내보내는 Cloud Billing 데이터에 적용된 스키마 변경사항을 처리하는 방법을 설명합니다.

변경사항 설명

BigQuery로 내보낸 Cloud Billing 일일 사용량 데이터의 테이블 스키마를 추가 데이터 필드로 더욱 명확하게끔 업데이트하였습니다. 이 테이블은 BigQuery 데이터 세트에서 gcp_billing_export_v1_<BILLING_ACCOUNT_ID>로 이름이 지정되어 있습니다.

다음 데이터 필드가 Cloud Billing BigQuery 사용량 내보내기 스키마에 추가되었습니다.

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

2020년 10월 29일부터 새로 도입되는 데이터로서 그 전에 기록된 데이터 사용량에는 사용할 수 없습니다. 필요한 경우 마이그레이션을 수행하여 새 스키마를 기반으로 통합 또는 자동화를 업데이트하세요. 새 필드에서 제공하는 데이터에 대한 자세한 내용은 BigQuery의 Cloud Billing 데이터 테이블 이해하기를 참조하세요.

기존 테이블 및 쿼리에 미치는 영향

일일 비용 데이터 내보내기의 테이블 구조가 변경됨에 따라 내보낸 테이블을 직접 참조하는 쿼리에서 사용 가능한 모든 데이터를 더 이상은 제공하지 않습니다. 이 문제를 해결하려면 내보낸 테이블을 쿼리하여 해당 정보를 원하는 구조로 표시하는 BigQuery 뷰를 만드는 것이 좋습니다. 그런 다음 보고서 및 대시보드를 피드하는 쿼리를 조정하여 내보낸 테이블이 아닌 뷰에서 데이터를 가져오면 됩니다.

뷰를 사용하면 쿼리와 대시보드에 사용되는 데이터 구조를 표준화할 수 있습니다.

모든 관련 테이블이 쿼리에 동일한 스키마를 표시하도록 생성된 뷰에서 데이터를 정규화해야 합니다. 그러면 이후의 스키마 변경사항으로부터 사용자가 보호되기 때문에 데이터 스키마가 변경될 때 해당 인스턴스에서 뷰의 기본 쿼리를 수정하면 됩니다.

스키마 변경사항을 처리하는 뷰 만들기

이전 스키마를 사용하는 테이블을 유지해야 하는 경우, 해당 테이블의 BigQuery 뷰를 만들어 데이터 스키마를 정규화하는 것이 좋습니다. 이전 스키마에서 새 스키마로 마이그레이션할 뷰를 만들 때 UNION을 사용하면 스키마가 일치하지 않는 테이블과 결합할 수 있습니다. 쿼리 및 대시보드에서 사용하는 데이터 필드에 따라 생성되는 뷰가 달라집니다.

쿼리에서 새 필드 project.numberadjustment_info를 사용하는지 여부와 관계없이 다음 예시 중 하나 이상이 사용자의 상황에 적용될 수 있습니다.

  1. 기존 스키마 속성과 credits.type, credits.id, credits.full, project.number, adjustment_info와 같은 새 속성이 포함된 테이블을 사용합니다. 이 뷰를 만드는 예시는 업데이트된 스키마의 모든 필드가 포함된 테이블 뷰 만들기를 참조하세요.
  2. 기존 스키마 속성 credits.type, credits.id, credits.full이 포함되지 않은 테이블을 사용합니다. 이 뷰를 만드는 방법의 예시는 credits.type, credits.id, credits.full이 포함되지 않은 테이블 뷰 만들기를 참조하세요.
  3. 기존 스키마 속성 credits.type, credits.id, credits.full이 포함된 테이블을 사용하지만 새 스키마 속성인 project.numberadjustment_info는 포함하지 않습니다. 이 뷰를 만드는 방법의 예시는 project.numberadjustment_info가 포함되지 않은 테이블 뷰 만들기를 참조하세요.

뷰에 액세스할 수 있는 데이터를 정의하는 데 사용되는 SQL 쿼리를 작성하여 뷰를 만들 수 있습니다. 자세한 내용은 뷰 만들기를 참조하세요.

다음은 BigQuery 뷰를 만드는 단계에 대한 요약입니다.

  1. 쿼리를 선택해 뷰를 만듭니다.
  2. 쿼리를 실행하고 결과를 관찰합니다.
  3. 뷰를 저장합니다.
  4. 새 뷰의 이름을 입력입니다.
  5. 새 뷰의 스키마 관찰합니다.

업데이트된 스키마의 모든 필드가 포함된 테이블 뷰 만들기

다음은 기존 쿼리와 업데이트된 스키마를 모두 사용하여 새 뷰를 만드는 쿼리입니다. 이 유형의 뷰에서는 향후 스키마 변경사항에 대한 노출이 제한됩니다.

쿼리에 이 뷰를 사용하면 모두 동일한 스키마가 사용되며 UNION 문이 정상적으로 작동합니다. 이 쿼리는 기본 테이블의 credits.type, credits.id, credits.full, project.number, adjustment_info 필드와 값을 유지합니다.

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

credits.type, credits.id, credits.full이 포함되지 않은 테이블 뷰 만들기

다음은 기존 스키마 속성 credits.type, credits.id, credits.full이 포함되지 않은 테이블을 사용하여 새 뷰를 만드는 쿼리입니다.

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

project.numberadjustment_info가 포함되지 않은 테이블 뷰 만들기

다음은 기존 스키마 속성 credits.type, credits.id, credits.full이 포함된 테이블을 사용하지만 새 스키마 속성인 project.numberadjustment_info는 포함하지 않은 새 뷰를 만드는 쿼리입니다.

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

뷰가 원래 테이블과 일치하는지 확인하기

다음 쿼리를 사용하면 생성된 뷰가 쿼리했던 원본 테이블과 일치하는 데이터를 제공하는지 확인할 수 있습니다. 이 쿼리는 credits.type, credits.id, credits.full이 포함되지 않은 예시에서 만든 뷰를 사용합니다. 이 뷰를 만드는 방법에 대한 자세한 내용은 credits.type, credits.id, credits.full이 포함되지 않은 테이블 뷰 만들기를 참조하세요.

이 쿼리는 원래 테이블과 credits.type, credits.id, credits.full이 포함되지 않고 생성된 뷰의 비용을 행별로 비교합니다.

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

이 쿼리는 원래 테이블과 credits.type, credits.id, credits.full이 포함되지 않고 생성된 뷰의 크레딧을 행별로 비교합니다.

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