수동으로 테이블 스키마 변경

이 문서에서는 기존 BigQuery 테이블의 스키마 정의를 수동으로 변경하는 방법을 설명합니다. 스키마 변경 작업은 BigQuery에서 기본적으로 지원되지 않는 경우가 많으므로 수동으로 해결해야 합니다. 지원되지 않는 스키마 수정 사항은 다음과 같습니다.

  • 열 이름 변경
  • 열의 데이터 유형 변경
  • 열 모드 변경(REQUIRED열을 NULLABLE로 완화하는 작업 제외)
  • 열 삭제

BigQuery에서 지원되는 스키마 변경사항에 대한 자세한 내용은 테이블 스키마 수정을 참조하세요.

열 이름 변경

열 이름 변경은 Google Cloud 콘솔, bq 명령줄 도구, API에서 지원되지 않습니다. 이름이 바뀐 열을 사용하여 테이블 스키마를 업데이트하려고 하면 다음 오류가 반환됩니다. BigQuery error in update operation: Provided Schema does not match Table project_id:dataset.table.

수동으로 열 이름을 변경하는 방법에는 다음 2가지가 있습니다.

  • SQL 쿼리 사용: 단순성이나 사용 편의성이 중요하고 비용 문제는 그다지 중요하지 않다면 이 옵션을 선택합니다.
  • 테이블 다시 만들기: 비용 문제가 중요하고 단순성이나 사용 편의성은 그다지 중요하지 않다면 이 옵션을 선택합니다.

옵션 1: 쿼리 사용

SQL 쿼리를 사용하여 열 이름을 변경하려면 테이블의 모든 열을 선택한 후 이름을 변경해야 하는 열에 별칭을 지정합니다. 그런 다음 쿼리 결과를 사용하여 기존 테이블을 덮어쓰거나 새 대상 테이블을 만들 수 있습니다. 새 이름으로 열에 별칭을 지정할 때는 BigQuery의 열 이름 규칙을 준수해야 합니다.

장점

  • 쿼리를 사용하여 새 대상 테이블에 데이터를 쓰면 원본 데이터가 유지됩니다.
  • 쿼리 작업을 사용하여 원본 테이블을 덮어쓰면 2개의 테이블이 아닌 1개의 테이블에 대해서만 저장용량 비용이 발생하지만 원본 데이터는 잃게 됩니다.

단점

  • 쿼리를 사용하여 열 이름을 변경하려면 전체 테이블을 검색해야 하며, 테이블이 매우 클 경우에는 상당한 쿼리 요금이 발생할 수 있습니다.
  • 쿼리 결과를 새 대상 테이블에 쓰는 경우에는 이전 테이블을 삭제하지 않는 한 이전 테이블과 새 테이블 모두에 스토리지 비용이 발생합니다.
  • 이름이 변경된 필요한 열이 null 허용 상태가 됩니다.

열 별칭 예

다음은 이름 변경이 필요한 2개 열을 제외하고 mytable의 모든 데이터를 선택하는 표준 SQL 쿼리를 보여 주는 예시입니다. 별칭은 이 2개 열의 새 이름을 생성하는 데 사용됩니다. column_onenewcolumn_one으로 이름이 변경되고, column_twonewcolumn_two로 이름이 변경됩니다. 쿼리 결과는 기존 테이블을 덮어쓰는 데 사용됩니다.

Console

  1. Google Cloud 콘솔에서 쿼리 편집기를 선택합니다.

  2. 쿼리 편집기에서 다음 쿼리를 입력하여 이름 변경이 필요한 2개 열을 제외하고 mydataset.mytable의 모든 데이터를 선택합니다. 여기서 mydataset.mytable은 기본 프로젝트에 있습니다. 쿼리는 별칭을 사용하여 column_one의 이름을 newcolumn_one으로, column_two의 이름을 newcolumn_two로 변경합니다.

    SELECT
     * EXCEPT(column_one, column_two),
     column_one AS newcolumn_one, column_two AS newcolumn_two
    FROM
     mydataset.mytable
  3. 더보기를 클릭하고 쿼리 설정을 선택합니다.

  4. 대상 섹션에서 다음을 수행합니다.

    1. 쿼리 결과의 대상 테이블 설정을 선택합니다.

    2. 데이터세트에서 myproject.mydataset를 선택합니다.

    3. 테이블 IDmytable을 입력합니다.

    4. 대상 테이블 쓰기 환경설정테이블 덮어쓰기를 클릭합니다. 그러면 쿼리 결과를 사용하여 mytable을 덮어씁니다.

  5. 저장을 클릭하여 설정을 업데이트한 후 쿼리 편집기에서 실행을 클릭합니다. 쿼리 작업이 완료되면 mytable의 열에 새 이름이 지정됩니다.

bq

다음 bq query 명령어를 입력하여 이름 변경이 필요한 2개 열을 제외하고 mydataset.mytable의 모든 데이터를 선택합니다. 여기서 mydataset.mytable은 기본 프로젝트에 있습니다. 쿼리는 별칭을 사용하여 column_one의 이름을 newcolumn_one으로, column_two의 이름을 newcolumn_two로 변경합니다.

--destination_table 플래그를 사용하여 쿼리 결과를 mydataset.mytable에 쓰고 --replace 플래그를 지정하여 mytable를 덮어씁니다. 표준 SQL 구문을 사용하려면 use_legacy_sql=false 플래그를 지정합니다.

(선택사항) --location 플래그를 지정하고 값을 사용자 위치로 설정합니다.

bq query \
--destination_table mydataset.mytable \
--replace \
--use_legacy_sql=false \
'SELECT
  * EXCEPT(column_one,
    column_two),
  column_one AS newcolumn_one,
  column_two AS newcolumn_two
FROM
  mydataset.mytable'

API

column_one의 이름을 newcolumn_one으로, column_two의 이름을 newcolumn_two로 변경하려면 jobs.insert 메서드를 호출하고 query 작업을 구성합니다. (선택사항) jobReference 섹션의 location 속성에 위치를 지정합니다.

쿼리 작업에 사용되는 SQL 쿼리는 SELECT * EXCEPT(column_one, column_two), column_one AS newcolumn_one, column_two AS newcolumn_two FROM mydataset.mytable입니다. 이 쿼리는 이름 변경이 필요한 2개 열을 제외하고 mytable의 모든 데이터를 선택합니다. 별칭은 이 2개 열의 새 이름을 생성하는 데 사용됩니다.

mytable을 쿼리 결과로 덮어쓰려면 configuration.query.destinationTable 속성에 mydataset.mytable를 포함하고 configuration.query.writeDisposition 속성에서 WRITE_TRUNCATE를 지정합니다. 새 대상 테이블을 지정하려면 configuration.query.destinationTable 속성에 테이블 이름을 입력합니다.

옵션 2: 새 테이블에 데이터 내보내기 및 로드

또한 테이블 데이터를 Cloud Storage로 내보낸 후 올바른 열 이름이 포함된 스키마 정의를 사용하여 새 테이블에 데이터를 로드하여 열의 이름을 지정할 수도 있습니다. 로드 작업을 통해 기존 테이블을 덮어쓸 수도 있습니다.

장점

  • 내보내기 작업이나 로드 작업에는 요금이 부과되지 않습니다. 현재 BigQuery 로드 및 내보내기 작업은 무료입니다.
  • 로드 작업을 사용하여 원본 테이블을 덮어쓰면 2개의 테이블이 아닌 1개의 테이블에 대해서만 저장용량 비용이 발생하지만 원본 데이터는 잃게 됩니다.

단점

  • 데이터를 새 테이블에 로드하는 경우에는 이전 테이블을 삭제하지 않는 한 원본 테이블과 새 테이블에 스토리지 비용이 발생합니다.
  • 내보낸 데이터를 Cloud Storage에 저장하면 비용이 발생합니다.

열 데이터 유형 변경

열의 데이터 유형 변경은 Google Cloud 콘솔, bq 명령줄 도구, API에서 지원되지 않습니다. 열의 새 데이터 유형을 지정하는 스키마를 적용하여 테이블을 업데이트하려고 하면 다음 오류가 반환됩니다. BigQuery error in update operation: Provided Schema does not match Table project_id:dataset.table.

수동으로 열 데이터 유형을 변경하는 방법에는 다음 2가지가 있습니다.

  • SQL 쿼리 사용: 단순성이나 사용 편의성이 중요하고 비용 문제는 그다지 중요하지 않다면 이 옵션을 선택합니다.
  • 테이블 다시 만들기: 비용 문제가 중요하고 단순성이나 사용 편의성은 그다지 중요하지 않다면 이 옵션을 선택합니다.

옵션 1: 쿼리 사용

SQL 쿼리를 사용하여 모든 테이블 데이터를 선택한 다음 관련 열을 다른 데이터 유형으로 변환합니다. 그런 다음 쿼리 결과를 사용하여 테이블을 덮어쓰거나 새 대상 테이블을 만들 수 있습니다.

장점

  • 쿼리를 사용하여 새 대상 테이블에 데이터를 쓰면 원본 데이터가 유지됩니다.
  • 쿼리 작업을 사용하여 원본 테이블을 덮어쓰면 2개의 테이블이 아닌 1개의 테이블에 대해서만 저장용량 비용이 발생하지만 원본 데이터는 잃게 됩니다.

단점

  • 쿼리를 사용하여 열의 데이터 유형을 변경하려면 전체 테이블을 검색해야 하며, 테이블이 매우 클 경우에는 상당한 쿼리 요금이 발생할 수 있습니다.
  • 쿼리 결과를 새 대상 테이블에 쓰는 경우에는 이전 테이블을 삭제하지 않는 한 이전 테이블과 새 테이블 모두에 스토리지 비용이 발생합니다.

CAST

다음 예시는 mydataset.mytable에서 column_twocolumn_three의 모든 데이터를 선택하고 column_oneDATE에서 STRING으로 변환하는 표준 SQL 쿼리를 보여줍니다. 쿼리 결과는 기존 테이블을 덮어쓰는 데 사용됩니다. 덮어쓴 테이블에는 column_oneSTRING 데이터 유형으로 저장됩니다.

CAST 사용 시 BigQuery가 변환을 수행할 수 없으면 쿼리가 실패할 수 있습니다. 표준 SQL의 변환 규칙에 대한 자세한 내용은 함수 및 연산자 참조 문서의 변환을 참조하세요.

Console

  1. Google Cloud 콘솔에서 새 쿼리 작성을 클릭합니다.

  2. 쿼리 편집기에 다음 쿼리를 입력하여 mydataset.mytablecolumn_twocolumn_three에서 모든 데이터를 선택하고 column_oneDATE에서 STRING으로 변환합니다. 쿼리에서 별칭을 사용하여 column_one을 같은 이름으로 변환합니다. 여기서 mydataset.mytable은 기본 프로젝트에 있습니다.

    SELECT
     column_two, column_three, CAST(column_one AS STRING) AS column_one
    FROM
     mydataset.mytable
  3. 더보기를 클릭하고 쿼리 설정을 선택합니다.

  4. 대상 섹션에서 쿼리 결과의 대상 테이블 설정을 선택합니다.

  5. 다음 필드에서 다음을 수행합니다.

    1. 프로젝트 이름에서 기본 프로젝트로 설정된 값을 그대로 둡니다. 이 프로젝트는 mydataset.mytable을 포함합니다.

    2. 데이터세트 이름에서 mydataset를 선택합니다.

    3. 테이블 이름 필드에 mytable을 입력합니다.

    4. 확인을 클릭합니다.

  6. 대상 테이블 쓰기 환경설정 섹션의 쓰기 환경설정에서 테이블 덮어쓰기를 선택합니다. 그러면 쿼리 결과를 사용하여 mytable을 덮어씁니다.

  7. (선택사항) 처리 위치에서 자동 선택을 클릭하고 데이터의 위치를 선택합니다.

  8. 저장을 클릭하여 설정을 업데이트한 후 쿼리 편집기에서 실행을 클릭합니다. 쿼리 작업이 완료되면 column_one의 데이터 유형이 STRING이 됩니다.

bq

다음 bq query 명령어를 입력하여 mydataset.mytablecolumn_twocolumn_three에서 모든 데이터를 선택하고 column_oneDATE에서 STRING으로 변환합니다. 쿼리에서 별칭을 사용하여 column_one을 같은 이름으로 변환합니다. 여기서 mydataset.mytable은 기본 프로젝트에 있습니다.

--destination_table 플래그를 사용하여 mydataset.mytable에 쿼리 결과가 쓰이고 --replace 플래그를 사용하여 mytable을 덮어씁니다. 표준 SQL 구문을 사용하려면 use_legacy_sql=false 플래그를 지정합니다.

(선택사항) --location 플래그를 지정하고 값을 사용자 위치로 설정합니다.

bq query \
--destination_table mydataset.mytable \
--replace \
--use_legacy_sql=false \
'SELECT
  column_two,
  column_three,
  CAST(column_one AS STRING) AS column_one
FROM
  mydataset.mytable'

API

mydataset.mytablecolumn_twocolumn_three에서 모든 데이터를 선택하고 column_oneDATE에서 STRING으로 변환하려면 jobs.insert 메서드를 호출하고 query 작업을 구성합니다. (선택사항) jobReference 섹션의 location 속성에 위치를 지정합니다.

쿼리 작업에 사용되는 SQL 쿼리는 SELECT column_two, column_three, CAST(column_one AS STRING) AS column_one FROM mydataset.mytable입니다. 쿼리에서 별칭을 사용하여 column_one을 같은 이름으로 변환합니다.

mytable을 쿼리 결과로 덮어쓰려면 configuration.query.destinationTable 속성에 mydataset.mytable를 포함하고 configuration.query.writeDisposition 속성에서 WRITE_TRUNCATE를 지정합니다.

옵션 2: 새 테이블에 데이터 내보내기 및 로드

또한 테이블 데이터를 Cloud Storage로 내보낸 후, 열의 올바른 데이터 유형을 지정하는 스키마 정의를 사용하여 새 테이블에 데이터를 로드하는 방식으로 열의 데이터 유형을 변경할 수도 있습니다. 로드 작업을 통해 기존 테이블을 덮어쓸 수도 있습니다.

장점

  • 내보내기 작업이나 로드 작업에는 요금이 부과되지 않습니다. 현재 BigQuery 로드 및 내보내기 작업은 무료입니다.
  • 로드 작업을 사용하여 원본 테이블을 덮어쓰면 2개의 테이블이 아닌 1개의 테이블에 대해서만 저장용량 비용이 발생하지만 원본 데이터는 잃게 됩니다.

단점

  • 데이터를 새 테이블에 로드하는 경우에는 이전 테이블을 삭제하지 않는 한 원본 테이블과 새 테이블에 스토리지 비용이 발생합니다.
  • 내보낸 데이터를 Cloud Storage에 저장하면 비용이 발생합니다.

열 모드 변경

현재 열 모드에 대해 지원되는 수정 작업은 모드를 REQUIRED에서 NULLABLE로 변경하는 것뿐입니다. 열 모드를 REQUIRED에서 NULLABLE로 변경하는 것을 열 완화라고도 합니다. REQUIRED 열을 NULLABLE로 완화하는 자세한 방법은 열 모드 완화를 참조하세요.

열 모드에 대해 지원되지 않는 변경사항을 적용하려고 하면 오류가 반환됩니다. 이 예시에서 열 모드를 NULLABLE에서 REPEATED로 변경하려고 하면 다음 오류가 반환됩니다. BigQuery error in update operation: Provided Schema does not match Table project_id:dataset.table. Field field has changed mode from NULLABLE to REPEATED.

새 테이블에 데이터 내보내기 및 로드

테이블 데이터를 Cloud Storage로 내보낸 후, 올바른 열 모드를 지정하는 스키마 정의를 사용하여 새 테이블에 데이터를 로드하는 방식으로 열 모드를 수동으로 변경할 수 있습니다. 로드 작업을 통해 기존 테이블을 덮어쓸 수도 있습니다.

장점

  • 내보내기 작업이나 로드 작업에는 요금이 부과되지 않습니다. 현재 BigQuery 로드 및 내보내기 작업은 무료입니다.
  • 로드 작업을 사용하여 원본 테이블을 덮어쓰면 2개의 테이블이 아닌 1개의 테이블에 대해서만 저장용량 비용이 발생하지만 원본 데이터는 잃게 됩니다.

단점

  • 데이터를 새 테이블에 로드하는 경우에는 이전 테이블을 삭제하지 않는 한 원본 테이블과 새 테이블에 스토리지 비용이 발생합니다.
  • 내보낸 데이터를 Cloud Storage에 저장하면 비용이 발생합니다.

테이블 스키마에서 열 삭제

기존 테이블의 스키마에서 열 삭제는 Google Cloud 콘솔, bq 명령줄 도구, API에서 지원되지 않습니다. 열을 제거하는 스키마를 적용하여 테이블을 업데이트하려고 하면 다음 오류가 반환됩니다. BigQuery error in update operation: Provided Schema does not match Table project_id:dataset.table.

열을 수동으로 삭제하는 방법에는 다음 2가지가 있습니다.

  • SQL 쿼리 사용: 단순성이나 사용 편의성이 중요하고 비용 문제는 그다지 중요하지 않다면 이 옵션을 선택합니다.
  • 테이블 다시 만들기: 비용 문제가 중요하고 단순성이나 사용 편의성은 그다지 중요하지 않다면 이 옵션을 선택합니다.

옵션 1: 쿼리 사용

열을 삭제하는 데 사용할 수 있는 SQL 문에는 다음 두 가지가 있습니다.

  • SELECT * EXCEPT
  • ALTER TABLE DROP COLUMN

다음 섹션에서는 삭제할 열(또는 여러 열)을 제외하는 SELECT * EXCEPT 쿼리를 사용하고 쿼리 결과를 사용하여 테이블을 덮어쓰거나 새 대상 테이블을 만드는 방법을 설명합니다.

ALTER TABLE DROP COLUMN 문을 사용하려면 데이터 정의 언어 페이지의 예시를 참조하세요.

장점

  • 쿼리를 사용하여 새 대상 테이블에 데이터를 쓰면 원본 데이터가 유지됩니다.
  • 쿼리 작업을 사용하여 원본 테이블을 덮어쓰면 2개의 테이블이 아닌 1개의 테이블에 대해서만 저장용량 비용이 발생하지만 원본 데이터는 잃게 됩니다.

단점

  • 쿼리를 사용하여 열을 삭제하려면 삭제할 열을 제외한 모든 열의 데이터를 검색해야 하며, 테이블이 매우 클 경우에는 상당한 쿼리 요금이 발생할 수 있습니다.
  • 쿼리 결과를 새 대상 테이블에 쓰는 경우에는 이전 테이블을 삭제하지 않는 한 이전 테이블과 새 테이블 모두에 스토리지 비용이 발생합니다.

SELECT * EXCEPT 예시

다음 예시는 column_two을 제외하고 mydataset.mytable에서 모든 데이터를 선택하는 표준 SQL 쿼리를 보여줍니다. 쿼리 결과는 기존 테이블을 덮어쓰는 데 사용됩니다.

Console

  1. Google Cloud 콘솔에서 새 쿼리 작성을 클릭합니다.

  2. 쿼리 편집기에서 다음 쿼리를 입력하여 column_two를 제외하고 mydataset.mytable에서 모든 데이터를 선택합니다. 여기서 mydataset.mytable은 기본 프로젝트에 있습니다.

    SELECT
     * EXCEPT(column_two)
    FROM
     mydataset.mytable
  3. 더보기를 클릭하고 쿼리 설정을 선택합니다.

  4. 대상 섹션에서 쿼리 결과의 대상 테이블 설정을 선택합니다.

  5. 다음 필드에서 다음을 수행합니다.

    1. 프로젝트 이름에서 기본 프로젝트로 설정된 값을 그대로 둡니다. 이 프로젝트는 mydataset.mytable을 포함합니다.

    2. 데이터세트 이름에서 mydataset를 선택합니다.

    3. 테이블 이름 필드에 mytable을 입력합니다.

    4. 확인을 클릭합니다.

  6. 대상 테이블 쓰기 환경설정 섹션의 쓰기 환경설정에서 테이블 덮어쓰기를 선택합니다. 그러면 쿼리 결과를 사용하여 mytable을 덮어씁니다.

  7. (선택사항) 처리 위치에서 자동 선택을 클릭하고 데이터의 위치를 선택합니다.

  8. 저장을 클릭하여 설정을 업데이트한 후 쿼리 편집기에서 실행을 클릭합니다. 쿼리 작업이 완료되면 이제 테이블에 column_two을 제외한 모든 열이 포함됩니다.

bq

다음 bq query 명령어를 입력하여 column_two를 제외하고 mydataset.mytable에서 모든 데이터를 선택합니다. 여기서 mydataset.mytable은 기본 프로젝트에 있습니다. --destination_table 플래그를 사용하여 mydataset.mytable에 쿼리 결과가 쓰이고 --replace 플래그를 사용하여 mytable을 덮어씁니다. 표준 SQL 구문을 사용하려면 use_legacy_sql=false 플래그를 지정합니다.

(선택사항) --location 플래그를 지정하고 값을 사용자 위치로 설정합니다.

bq query \
--destination_table mydataset.mytable \
--replace \
--use_legacy_sql=false \
'SELECT
  * EXCEPT(column_two)
FROM
  mydataset.mytable'

API

column_two을 제외하고 mydataset.mytable에서 모든 데이터를 선택하려면 jobs.insert 메서드를 호출하고 query 작업을 구성합니다. (선택사항) jobReference 섹션의 location 속성에 위치를 지정합니다.

쿼리 작업에 사용되는 SQL 쿼리는 SELECT * EXCEPT(column_two) FROM mydataset.mytable입니다.

mytable을 쿼리 결과로 덮어쓰려면 configuration.query.destinationTable 속성에 mydataset.mytable를 포함하고 configuration.query.writeDisposition 속성에서 WRITE_TRUNCATE를 지정합니다.

옵션 2: 새 테이블에 데이터 내보내기 및 로드

테이블 데이터를 Cloud Storage로 내보내기한 다음 삭제할 열에 해당하는 데이터를 삭제한 다음, 삭제된 열을 포함하지 않는 스키마 정의를 사용하여 새 테이블에 데이터를 로드하는 방법으로 열을 삭제할 수도 있습니다. 로드 작업을 통해 기존 테이블을 덮어쓸 수도 있습니다.

장점

  • 내보내기 작업이나 로드 작업에는 요금이 부과되지 않습니다. 현재 BigQuery 로드 및 내보내기 작업은 무료입니다.
  • 로드 작업을 사용하여 원본 테이블을 덮어쓰면 2개의 테이블이 아닌 1개의 테이블에 대해서만 저장용량 비용이 발생하지만 원본 데이터는 잃게 됩니다.

단점

  • 데이터를 새 테이블에 로드하는 경우에는 이전 테이블을 삭제하지 않는 한 원본 테이블과 새 테이블에 스토리지 비용이 발생합니다.
  • 내보낸 데이터를 Cloud Storage에 저장하면 비용이 발생합니다.

테이블 보안

BigQuery에서 테이블에 대한 액세스를 제어하려면 테이블 액세스 제어 소개를 참조하세요.