수동으로 테이블 스키마 변경
이 문서에서는 기존 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_one
은 newcolumn_one
으로 이름이 변경되고, column_two
는 newcolumn_two
로 이름이 변경됩니다. 쿼리 결과는 기존 테이블을 덮어쓰는 데 사용됩니다.
Console
Google Cloud 콘솔에서 쿼리 편집기를 선택합니다.
쿼리 편집기에서 다음 쿼리를 입력하여 이름 변경이 필요한 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
더보기를 클릭하고 쿼리 설정을 선택합니다.
대상 섹션에서 다음을 수행합니다.
쿼리 결과의 대상 테이블 설정을 선택합니다.
데이터세트에서
myproject.mydataset
를 선택합니다.테이블 ID에
mytable
을 입력합니다.대상 테이블 쓰기 환경설정에 테이블 덮어쓰기를 클릭합니다. 그러면 쿼리 결과를 사용하여
mytable
을 덮어씁니다.
저장을 클릭하여 설정을 업데이트한 후 쿼리 편집기에서 실행을 클릭합니다. 쿼리 작업이 완료되면
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_two
와 column_three
의 모든 데이터를 선택하고 column_one
을 DATE
에서 STRING
으로 변환하는 표준 SQL 쿼리를 보여줍니다. 쿼리 결과는 기존 테이블을 덮어쓰는 데 사용됩니다. 덮어쓴 테이블에는 column_one
이 STRING
데이터 유형으로 저장됩니다.
CAST
사용 시 BigQuery가 변환을 수행할 수 없으면 쿼리가 실패할 수 있습니다. 표준 SQL의 변환 규칙에 대한 자세한 내용은 함수 및 연산자 참조 문서의 변환을 참조하세요.
Console
Google Cloud 콘솔에서 새 쿼리 작성을 클릭합니다.
쿼리 편집기에 다음 쿼리를 입력하여
mydataset.mytable
의column_two
및column_three
에서 모든 데이터를 선택하고column_one
를DATE
에서STRING
으로 변환합니다. 쿼리에서 별칭을 사용하여column_one
을 같은 이름으로 변환합니다. 여기서mydataset.mytable
은 기본 프로젝트에 있습니다.SELECT column_two, column_three, CAST(column_one AS STRING) AS column_one FROM mydataset.mytable
더보기를 클릭하고 쿼리 설정을 선택합니다.
대상 섹션에서 쿼리 결과의 대상 테이블 설정을 선택합니다.
다음 필드에서 다음을 수행합니다.
프로젝트 이름에서 기본 프로젝트로 설정된 값을 그대로 둡니다. 이 프로젝트는
mydataset.mytable
을 포함합니다.데이터세트 이름에서
mydataset
를 선택합니다.테이블 이름 필드에
mytable
을 입력합니다.확인을 클릭합니다.
대상 테이블 쓰기 환경설정 섹션의 쓰기 환경설정에서 테이블 덮어쓰기를 선택합니다. 그러면 쿼리 결과를 사용하여
mytable
을 덮어씁니다.(선택사항) 처리 위치에서 자동 선택을 클릭하고 데이터의 위치를 선택합니다.
저장을 클릭하여 설정을 업데이트한 후 쿼리 편집기에서 실행을 클릭합니다. 쿼리 작업이 완료되면
column_one
의 데이터 유형이STRING
이 됩니다.
bq
다음 bq query
명령어를 입력하여 mydataset.mytable
의 column_two
및 column_three
에서 모든 데이터를 선택하고 column_one
을 DATE
에서 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.mytable
의 column_two
및 column_three
에서 모든 데이터를 선택하고 column_one
를 DATE
에서 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
Google Cloud 콘솔에서 새 쿼리 작성을 클릭합니다.
쿼리 편집기에서 다음 쿼리를 입력하여
column_two
를 제외하고mydataset.mytable
에서 모든 데이터를 선택합니다. 여기서mydataset.mytable
은 기본 프로젝트에 있습니다.SELECT * EXCEPT(column_two) FROM mydataset.mytable
더보기를 클릭하고 쿼리 설정을 선택합니다.
대상 섹션에서 쿼리 결과의 대상 테이블 설정을 선택합니다.
다음 필드에서 다음을 수행합니다.
프로젝트 이름에서 기본 프로젝트로 설정된 값을 그대로 둡니다. 이 프로젝트는
mydataset.mytable
을 포함합니다.데이터세트 이름에서
mydataset
를 선택합니다.테이블 이름 필드에
mytable
을 입력합니다.확인을 클릭합니다.
대상 테이블 쓰기 환경설정 섹션의 쓰기 환경설정에서 테이블 덮어쓰기를 선택합니다. 그러면 쿼리 결과를 사용하여
mytable
을 덮어씁니다.(선택사항) 처리 위치에서 자동 선택을 클릭하고 데이터의 위치를 선택합니다.
저장을 클릭하여 설정을 업데이트한 후 쿼리 편집기에서 실행을 클릭합니다. 쿼리 작업이 완료되면 이제 테이블에
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에서 테이블에 대한 액세스를 제어하려면 테이블 액세스 제어 소개를 참조하세요.