파티션을 나눈 테이블 데이터 관리

이 문서는 BigQuery에서 파티션을 나눈 테이블 데이터를 관리하는 방법을 설명합니다. 파티션을 나눈 테이블 데이터로 수행할 수 있는 작업은 다음과 같습니다.

  • 파티션을 나눈 테이블에 데이터 로드
  • 파티션을 나눈 테이블 데이터 찾아보기 또는 미리보기
  • 파티션을 나눈 테이블 데이터 쿼리
  • 파티션을 나눈 테이블 데이터에 추가 또는 덮어쓰기
  • 데이터 조작 언어 문을 사용하여 파티션을 나눈 테이블 데이터 수정
  • 파티션을 나눈 테이블 데이터 복사
  • 파티션을 나눈 테이블로 데이터 스트리밍
  • 파티션을 나눈 테이블 데이터 내보내기

테이블 스키마 관리에 대한 자세한 내용은 테이블 스키마 수정을 참조하세요.

파티션을 나눈 테이블에 데이터 로드

데이터를 로드할 때 파티션을 나눈 테이블을 만들거나, 파티션을 나눈 빈 테이블을 만들고 나중에 데이터를 로드할 수 있습니다. 파티션을 나눈 테이블에 데이터 로드 시 지원되는 데이터 형식에 스키마 자동 감지를 사용하거나 스키마를 지정할 수 있습니다.

데이터 로드에 자세한 내용은 소스 데이터 형식 및 위치에 대한 문서를 참조하세요.

테이블 데이터 찾아보기

다음과 같은 방법으로 파티션을 나눈 테이블 데이터를 탐색할 수 있습니다.

  • GCP Console 또는 기본 BigQuery 웹 UI 사용
  • 명령줄 도구의 bq head 명령어 사용
  • tabledata.list API 메소드 호출

필수 권한

데이터세트 수준에서 테이블 데이터를 탐색하려면 탐색할 파티션을 나눈 테이블이 포함된 데이터세트에 대한 READER 액세스 권한이 필요합니다.

데이터세트 수준의 권한을 사용하는 대신 bigquery.tables.getData 권한이 포함된 IAM 역할을 활용할 수도 있습니다. 사전 정의된 프로젝트 수준의 모든 IAM 역할에는 bigquery.user, bigquery.jobUser, bigquery.metadataViewer제외한 bigquery.tables.getData 권한이 포함됩니다.

또한 bigquery.user 역할에는 bigquery.datasets.create 권한이 있으므로, bigquery.user 역할이 할당된 사용자는 자신이 만든 데이터세트에 있는 모든 테이블의 데이터를 읽을 수 있습니다. bigquery.user 역할이 할당된 사용자가 데이터세트를 만든 경우, 다른 소유자가 설정되지 않으면 해당 사용자에게 데이터세트에 대한 OWNER 액세스 권한이 부여됩니다. 데이터세트에 대한 OWNER 액세스 권한이 있는 사용자는 해당 데이터세트와 데이터세트에 포함된 모든 테이블을 완벽하게 제어할 수 있습니다.

BigQuery의 IAM 역할과 권한에 대한 자세한 내용은 액세스 제어를 참조하세요. 데이터세트 수준 역할에 대한 자세한 내용은 데이터세트 기본 역할을 참조하세요.

파티션을 나눈 테이블 데이터 찾아보기

파티션을 나눈 테이블 데이터를 찾아보려면 다음 단계를 따르세요.

기본 UI

  1. BigQuery 웹 UI의 탐색창에서 데이터세트 왼쪽에 있는 파란색 화살표를 클릭하여 데이터세트를 확장하거나 데이터세트 이름을 더블클릭합니다. 그러면 데이터세트에 있는 테이블과 뷰가 표시됩니다.

  2. 목록에서 파티션을 나눈 테이블을 클릭합니다. BigQuery 웹 UI를 사용하여 개별 파티션을 미리 볼 수 없습니다.

  3. 세부정보를 클릭하고 행 개수 값을 확인합니다. CLI 또는 API를 사용하여 결과의 ​​시작점을 제어하려면 이 값이 필요할 수 있습니다.

  4. 미리보기를 클릭합니다. 샘플 데이터세트가 표시됩니다.

    테이블 미리보기

명령줄

특정 수의 테이블 행에 있는 모든 필드를 나열하려면 bq head 명령어를 --max_rows 플래그와 함께 실행합니다. --max_rows를 지정하지 않을 경우, 기본값은 100입니다. 파티션 데코레이터를 사용하여 찾아볼 파티션을 지정합니다(예: $20180224).

bq head 명령어는 쿼리 작업을 생성하지 않으므로, bq head 명령어는 쿼리 기록에 표시되지 않으며 비용이 청구되지 않습니다.

테이블의 일부 필드(중첩 및 반복 필드 포함)를 찾아보려면 --selected_fields 플래그를 사용하고 필드를 쉼표로 구분된 목록으로 입력합니다.

테이블 데이터를 표시하기 전에 건너뛸 행 수를 지정하려면 --start_row=[INTEGER] 플래그(또는 단축형 -s)를 사용합니다. 기본값은 0입니다. bq show 명령어로 테이블 정보를 검색하여 테이블의 행 수를 검색할 수 있습니다.

찾아볼 테이블이 기본 프로젝트가 아닌 다른 프로젝트에 있는 경우, 프로젝트 ID를 [PROJECT_ID]:[DATASET].[TABLE] 형식으로 명령어에 추가합니다.

bq head --max_rows [INTEGER1] --start_row [INTEGER2] --selected_fields "[FIELDS]" [PROJECT_ID]:[DATASET].[TABLE]$[PARTITION]

각 항목의 의미는 다음과 같습니다.

  • [INTEGER1]은 표시할 행 수입니다.
  • [INTEGER2]는 데이터를 표시하기 전에 건너뛸 행 수입니다.
  • [FIELDS]는 쉼표로 구분된 필드 목록입니다.
  • [PROJECT_ID]는 프로젝트 ID입니다.
  • [DATASET]는 테이블이 포함된 데이터세트 이름입니다.
  • [TABLE]은 찾아볼 테이블 이름입니다.
  • [PARTITION]은 파티션 데코레이터입니다.

예:

다음 명령어를 입력하면 "2018-02-24" 파티션의 mydataset.mytable에 있는 처음 10개 행의 모든 필드가 나열됩니다. mydataset는 기본 프로젝트에 있습니다.

bq head --max_rows=10 mydataset.mytable$20180224

다음 명령어를 입력하면 "2016-09-01" 파티션의 mydataset.mytable에 있는 처음 100개 행의 모든 필드가 나열됩니다. mydataset는 기본 프로젝트가 아닌 myotherproject에 있습니다.

bq head --format=prettyjson 'mydataset.mycolumntable2$20160901'

다음 명령어를 입력하면 "2016-09-01" 파티션의 mydataset.mytable에서 field1field2만 표시됩니다. 이 명령어는 --start_row 플래그를 사용하여 100번째 행으로 건너뜁니다. mydataset.mytable은 기본 프로젝트에 있습니다.

bq head --format=prettyjson --start_row 100 --selected_fields "state_number" 'mydataset.mycolumntable2$20160901'

API

tabledata.list를 호출하여 테이블의 데이터를 찾아볼 수 있습니다. tableId 매개변수에 테이블과 파티션 데코레이터 이름을 지정합니다.

다음과 같은 선택적 매개변수를 구성하여 출력을 제어할 수 있습니다.

  • maxResults — 반환할 결과 최대 수입니다.
  • selectedFields — 반환할 필드를 쉼표로 구분한 목록입니다. 지정하지 않으면 모든 필드가 반환됩니다.
  • startIndex — 읽기를 시작할 행의 0부터 시작하는 색인입니다.

반환되는 값은 JSON 객체에 래핑되므로, tabledata.list 참조 문서의 설명에 따라 객체를 파싱해야 합니다.

파티션을 나눈 테이블 데이터 쿼리

데이터를 BigQuery에 로드한 후 테이블의 데이터를 쿼리할 수 있습니다. BigQuery는 다음 두 가지 유형의 쿼리를 지원합니다.

기본적으로 BigQuery는 양방향 쿼리를 실행합니다. 즉, 최대한 빨리 쿼리가 실행됩니다.

BigQuery는 일괄 쿼리도 제공합니다. BigQuery는 사용자를 대신하여 각 일괄 쿼리를 대기열에 포함시키고 유휴 리소스를 사용할 수 있으면 바로(대개 몇 분 소요) 쿼리를 시작합니다.

다음을 사용하여 양방향 쿼리와 일괄 쿼리를 실행할 수 있습니다.

자세한 내용은 파티션 테이블 쿼리를 참조하세요.

파티션을 나눈 테이블 데이터에 추가 및 덮어쓰기

로드 또는 쿼리 작업을 수행하여 파티션을 나눈 테이블 데이터를 덮어쓸 수 있습니다. 쿼리 결과를 추가하거나 로드-추가 작업을 수행하여 추가 데이터를 파티션을 나눈 기존 테이블에 추가할 수 있습니다.

필수 권한

기존 파티션을 덮어쓰거나 기존 파티션에 데이터를 추가하려면 데이터세트 수준의 WRITER 액세스 권한이 있거나 bigquery.tables.updateData 권한이 포함된 프로젝트 수준의 IAM 역할을 할당받아야 합니다. 다음과 같은 사전 정의된 프로젝트 수준의 IAM 역할에는 bigquery.tables.updateData 권한이 포함되어 있습니다.

또한 bigquery.user 역할에는 bigquery.datasets.create 권한이 있으므로, bigquery.user 역할에 할당된 사용자는 자신이 데이터세트에서 만든 모든 테이블의 파티션에서 데이터를 덮어쓰거나 추가할 수 있습니다. bigquery.user 역할이 할당된 사용자가 데이터세트를 만든 경우, 다른 소유자가 지정되지 않으면 해당 사용자에게 데이터세트에 대한 OWNER 액세스 권한이 부여됩니다. 데이터세트에 대한 OWNER 액세스 권한이 있는 사용자는 해당 데이터세트와 그 안에 포함된 모든 테이블과 테이블 파티션을 완벽하게 제어할 수 있습니다.

로드 작업이나 쿼리 작업을 실행하려면 bigquery.jobs.create 권한도 부여 받아야 합니다. 다음과 같은 사전 정의된 프로젝트 수준의 IAM 역할에는 bigquery.jobs.create 권한이 있습니다.

BigQuery의 IAM 역할과 권한에 대한 자세한 내용은 액세스 제어를 참조하세요. 데이터세트 수준 역할에 대한 자세한 내용은 데이터세트 기본 역할을 참조하세요.

로드 작업 사용

bq load 명령어를 사용하거나 jobs.insert 메소드를 호출하고 로드 작업을 구성하여 파티션을 추가하거나 덮어쓸 수 있습니다. GCP Console과 기본 BigQuery 웹 UI는 로드 작업에서 파티션 추가 또는 덮어쓰기를 지원하지 않습니다.

로드 작업을 사용하여 특정 파티션에 데이터를 추가하거나 덮어쓰는 경우, 다음 사항에 유의하세요.

  • Cloud Storage에서 데이터 로드 시 버킷은 BigQuery 데이터세트와 같은 위치에 있어야 합니다.
  • 로드한 데이터가 테이블의 파티션 스키마를 준수해야 합니다. 파티션에 기록되는 모든 행은 파티션의 날짜에 속하는 값을 가져야 합니다.
  • 파티션을 나눈 테이블의 파티션은 테이블 스키마를 공유하므로, 파티션의 데이터를 바꿔도 테이블의 스키마는 대체되지 않습니다. 대신 새 데이터의 스키마가 테이블 스키마와 호환되어야 합니다. 로드 작업에서 테이블 스키마 업데이트에 대한 자세한 내용은 테이블 스키마 관리를 참조하세요.
  • 내부 데이터화 시간으로 파티션을 나눈 테이블에 데이터를 추가하는 경우, 파티션 데코레이터를 지정하지 않으면 현재 파티션이 사용됩니다.

로드 작업을 사용하여 파티션을 나눈 테이블 데이터에 추가하거나 덮어쓰려면 대상 테이블과 파티션 데코레이터를 지정하고 쓰기 처리 플래그를 다음 중 하나로 설정합니다.

CLI 옵션 API 옵션 설명
--noreplace WRITE_APPEND 데이터를 기존 파티션에 추가합니다. 쓰기 처리 옵션이 지정되지 않으면 기본 동작은 파티션에 데이터를 추가하는 것입니다.
--replace WRITE_TRUNCATE 파티션을 덮어씁니다(수정).

파티션 데코레이터는 특정 날짜를 나타내며 다음 형식을 취합니다.

$YYYYMMDD

예를 들어, 다음 명령어는 mydataset.table1이라는 파티션을 나눈 테이블에서 2016년 1월 1일(20160101) 날짜의 전체 파티션에 있는 데이터를 대체합니다. JSON 데이터는 Cloud Storage 버킷에서 로드됩니다. Cloud Storage 버킷 및 BigQuery 데이터세트는 asia-northeast1 지역에서 생성되었습니다.

bq --location=asia-northeast1 load --replace --source_format=NEWLINE_DELIMITED_JSON 'mydataset.table1$20160101' gs://mybucket/myfile.json

로드 작업을 사용하여 데이터에 추가하거나 덮어쓰는 자세한 방법은 소스 데이터 형식에 따라 다음 문서를 참조하세요.

쿼리 작업 사용

bq query 명령어를 사용하거나 jobs.insert 메소드를 호출하고 쿼리 작업을 구성하여 파티션을 추가하거나 덮어쓸 수 있습니다. GCP Console과 기존 BigQuery 웹 UI는 쿼리 작업에서 파티션 추가 또는 덮어쓰기를 지원하지 않습니다.

쿼리 작업을 사용하여 파티션을 추가하거나 덮어쓰는 경우에는 다음 사항에 유의하세요.

  • 쿼리 대상 테이블이 추가하거나 덮어쓰는 테이블과 같은 위치에 있어야 합니다.
  • 내부 데이터화 시간으로 파티션을 나눈 테이블에 추가하거나 덮어쓰는 경우, 이전 SQL 또는 표준 SQL 구문을 사용할 수 있습니다.
  • 파티션을 나눈 테이블의 파티션에 추가하거나 덮어쓰는 경우에는 표준 SQL 구문을 사용해야 합니다. 현재 이전 SQL로는 파티션을 나눈 테이블을 쿼리하거나 쿼리 결과를 파티션을 나눈 테이블에 쓸 수 없습니다.
  • 쿼리 결과를 파티션에 쓰는 경우, 파티션에 쓰는 데이터는 테이블의 파티션 스키마를 준수해야 합니다. 파티션에 기록되는 모든 행은 파티션의 날짜에 속하는 값을 가져야 합니다.
  • 내부 데이터화 시간으로 파티션을 나눈 테이블에 데이터를 추가하는 경우, 파티션 데코레이터를 지정하지 않으면 현재 파티션이 사용됩니다.

쿼리 결과를 사용하여 파티션에 추가하거나 덮어쓰려면 파티션 데코레이터가 있는 대상 테이블을 지정하고 쓰기 처리를 다음 중 하나로 설정합니다.

CLI 옵션 API 옵션 설명
--append_table WRITE_APPEND 쿼리 결과를 기존 파티션에 추가합니다.
--replace WRITE_TRUNCATE 쿼리 결과를 사용하여 파티션을 덮어씁니다(수정).

예를 들어, 다음 명령어는 쿼리 결과를 사용하여 table1의 2016년 3월 1일(20160301) 파티션에 대한 데이터를 수정합니다. 대상 테이블과 쿼리되는 테이블은 모두 US 다중 지역 위치에 있습니다.

bq --location=US query --use_legacy_sql=false --replace --destination_table 'mydataset.table1$20160301' 'SELECT column1, column2 FROM mydataset.mytable'

대상 테이블이 있고 파티션을 나누지 않은 경우 다음 오류가 반환됩니다. BigQuery error in query operation: Error processing job '[PROJECT][JOB_ID]' Incompatible table partitioning specification. Expects partitioning specification interval (type:day), but input partitioning specification is none.

쿼리 결과를 사용한 데이터 추가 또는 덮어쓰기에 대한 자세한 내용은 쿼리 결과 쓰기를 참조하세요.

DML 문을 사용하여 파티션을 나눈 테이블 데이터 수정

표준 SQL 언어의 DML 문을 사용하여 파티션을 나눈 테이블의 데이터를 수정할 수 있습니다. DML 문을 사용하면 대량 행을 업데이트, 삽입, 삭제할 수 있습니다. 파티션을 나눈 테이블에서 DML을 사용하는 예는 DML 문을 사용하여 파티션을 나눈 테이블 데이터 업데이트를 참조하세요.

이전 SQL 언어는 DML 문을 지원하지 않습니다. 이전 SQL을 사용하여 데이터를 업데이트 또는 삭제하려면 파티션을 나눈 테이블을 삭제한 후 새 데이터로 테이블을 다시 만들어야 합니다. 또는 데이터를 수정하고 쿼리 결과를 새로운 파티션을 나눈 테이블에 쓰는 쿼리를 작성할 수 있습니다.

파티션을 나눈 테이블 데이터 복사

다음과 같은 방법으로 파티션을 나눈 테이블을 복사할 수 있습니다.

  • GCP Console 또는 기본 BigQuery 웹 UI 사용
  • 명령줄 도구의 bq cp 명령어 사용
  • jobs.insert API 메소드를 호출하고 복사 작업 구성

테이블 복사에 대한 자세한 내용은 테이블 복사를 참조하세요.

명령줄 도구의 bq cp 명령어를 사용하거나 jobs.insert API 메소드를 호출하고 복사 작업을 구성하여 파티션을 한 개 이상 복사할 수 있습니다. 현재 GCP Console 또는 기본 BigQuery 웹 UI는 파티션 복사를 지원하지 않습니다.

파티션 복사에 대한 자세한 내용은 파티션 복사를 참조하세요.

파티션을 나눈 테이블로 데이터 스트리밍

데이터를 특정 파티션으로 스트리밍하려면 스트리밍할 테이블의 tableId를 지정할 때 파티션 데코레이터를 사용합니다. 예를 들어, 다음 명령어는 2017년 1월 1일($20170101) 날짜의 파티션에 대한 단일 행을 mydataset.mytable이라는 파티션을 나눈 테이블로 스트리밍합니다.

echo '{"a":1, "b":2}' | bq insert 'mydataset.mytable$20170101'

이 명령어는 파티션 데코레이터 사용을 보여줍니다. bq insert 명령어는 테스트용입니다. 데이터를 BigQuery로 스트리밍하려면 API의 tabledata.insertAll 메소드를 사용합니다. 데이터를 파티션에 스트리밍에 대한 자세한 내용은 파티션을 나눈 테이블로 스트리밍을 참조하세요.

파티션 데코레이터를 사용하여 스트리밍하는 경우, 현재 UTC 시간을 기준으로 지난 30일과 향후 5일 이내의 파티션을 스트리밍할 수 있습니다. 여기서 허용된 범위를 벗어난 날짜의 파티션에 쓰려면 로드 또는 쿼리 작업을 사용하면 됩니다.

데이터 스트리밍 시 시간으로 파티션을 나눈 테이블을 대상 테이블로 지정하면 각 파티션에 스트리밍 버퍼가 생깁니다. writeDisposition 속성을 WRITE_TRUNCATE로 설정하여 파티션을 덮어 쓰는 로드, 쿼리 또는 복사 작업을 수행하면 스트리밍 버퍼가 유지됩니다. 스트리밍 버퍼를 삭제하려면 파티션에 tables.get을 호출하여 스트리밍 버퍼가 비어 있는지 확인합니다.

테이블 데이터 내보내기

파티션을 나눈 테이블에서 데이터를 내보내는 방법은 파티션을 나누지 않은 테이블에서 데이터를 내보내는 방법과 동일합니다. 현재 개별 파티션을 내보낼 수 없습니다. 자세한 내용은 테이블 데이터 내보내기를 참조하세요.

파티션을 나눈 테이블 데이터를 CSV, JSON 또는 Avro 형식으로 내보낼 수 있습니다. 현재 데이터를 Cloud Storage 버킷으로 내보내야 합니다. 로컬 머신으로 내보내기는 지원되지 않습니다. 하지만 GCP Console이나 기본 BigQuery 웹 UI를 사용하여 쿼리 결과를 다운로드하여 저장할 수 있습니다.

다음 단계

파티션을 나눈 테이블 작업에 대해 자세히 알아보세요.

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

도움이 필요하시나요? 지원 페이지를 방문하세요.