이 문서에서는 DATE
, TIMESTAMP
, 또는 DATETIME
열로 파티션을 나눈 테이블을 만들고 사용하는 방법을 설명합니다. 수집 시간으로 파티션을 나눈 테이블에 대한 자세한 내용은 수집 시간으로 파티션을 나눈 테이블 생성 및 사용을 참조하세요. 정수 범위로 파티션을 나눈 테이블에 대한 자세한 내용은 정수 범위로 파티션을 나눈 테이블 만들기 및 사용을 참조하세요.
파티션을 나눈 테이블을 만든 후에는 다음 작업을 수행할 수 있습니다.
- 테이블 데이터에 대한 액세스 제어
- 파티션을 나눈 테이블에 대한 정보 가져오기
- 데이터 세트의 파티션을 나눈 테이블 나열
- 메타테이블을 사용하여 파티션을 나눈 테이블 메타데이터 가져오기
파티션을 나눈 테이블 속성 업데이트, 파티션을 나눈 테이블 복사 및 삭제를 비롯한 파티션을 나눈 테이블 관리에 대한 자세한 내용은 파티션을 나눈 테이블 관리를 참조하세요.
제한사항
파티션을 나눈 테이블에는 다음과 같은 제한사항이 적용됩니다.
- 파티션 나누기 열은 스칼라
DATE
,TIMESTAMP
또는DATETIME
열이어야 합니다. 열의 모드는REQUIRED
나NULLABLE
일 수는 있지만REPEATED
(배열 기반)이어서는 안 됩니다. - 파티션 나누기 열은 최상위 필드여야 합니다.
RECORD
(STRUCT
)의 리프 필드는 파티션 나누기 열로 사용할 수 없습니다. - legacy SQL로는 파티션을 나눈 테이블을 쿼리하거나 쿼리 결과를 파티션을 나눈 테이블에 쓸 수 없습니다.
파티션을 나눈 테이블 만들기
다음과 같은 방법으로 파티션을 나눈 테이블을 만들 수 있습니다.
- Cloud Console 사용하여 만들기
partition expression
이 포함된PARTITION BY
절과 함께 데이터 정의 언어(DDL)CREATE TABLE
문을 사용하여 만들기bq
명령줄 도구의bq mk
명령어 사용하여 만들기tables.insert
API 메서드를 호출하여 프로그래매틱 방식으로 만들기- 쿼리 결과에서 만들기
- 데이터를 로드할 때 만들기
테이블 이름 지정
BigQuery에서 테이블을 만들 때 테이블 이름은 데이터 세트마다 고유해야 합니다. 테이블 이름을 지정하는 규칙은 다음과 같습니다.
- 최대 1,024자를 포함합니다.
- L(문자), M(표시), N(숫자), Pc(밑줄 포함 커넥터), Pd(대시), Zs(공백) 카테고리의 유니코드를 포함합니다. 자세한 내용은 일반 카테고리를 참조하세요.
예를 들어 table-01
, ग्राहक
, 00_お客様
, étudiant
는 모두 유효한 테이블 이름입니다.
일부 테이블 이름과 테이블 이름 프리픽스가 예약되어 있습니다. 테이블 이름 또는 프리픽스가 예약되어 있다는 오류가 표시되면 다른 이름을 선택한 후 다시 시도하세요.
필수 권한
테이블을 만들려면 최소한 다음 권한이 부여되어 있어야 합니다.
- 테이블을 만들 수 있는
bigquery.tables.create
권한 - 로드 작업, 쿼리 작업 또는 복사 작업을 사용하여 테이블에 데이터를 쓸 수 있는
bigquery.tables.updateData
권한 - 테이블에 데이터를 쓰는 쿼리 작업, 로드 작업, 복사 작업을 실행할 수 있는
bigquery.jobs.create
권한
테이블에 쓰는 데이터에 액세스하려면 bigquery.tables.getData
와 같은 추가 권한이 필요할 수 있습니다.
다음과 같은 사전 정의된 IAM 역할에는 bigquery.tables.create
권한과 bigquery.tables.updateData
권한이 모두 포함되어 있습니다.
bigquery.dataEditor
bigquery.dataOwner
bigquery.admin
다음과 같은 사전 정의된 IAM 역할에는 bigquery.jobs.create
권한이 포함되어 있습니다.
bigquery.user
bigquery.jobUser
bigquery.admin
또한 bigquery.datasets.create
권한이 있는 사용자는 데이터 세트를 만들 때 해당 데이터 세트에 대한 bigquery.dataOwner
액세스 권한을 부여받습니다.
bigquery.dataOwner
액세스 권한이 있는 사용자는 데이터 세트에서 테이블을 만들고 업데이트할 수 있습니다.
BigQuery의 IAM 역할과 권한에 대한 자세한 내용은 사전 정의된 역할 및 권한을 참조하세요.
일일 파티션 나누기와 시간별, 월간 또는 연간 파티션 나누기 비교
TIMESTAMP
, DATETIME
또는 DATE
열을 사용하여 데이터를 파티션을 나누는 경우 데이터 및 필요에 따라 일별, 시간별, 월간 또는 연간 세부사항별로 파티션을 만들 수 있습니다.
일별 파티션 나누기는 기본 파티션 나누기 유형이며, 클러스터링과 함께 사용할 경우 대부분의 BigQuery 사용 사례에 적합합니다. 특히 데이터가 광범위한 기간에 걸쳐 있거나 시간이 지남에 따라 데이터가 계속 추가되는 경우에는 일별 파티션 나누기가 더 좋습니다. 데이터가 광범위한 기간에 걸쳐 있는 경우 일별 파티션 나누기를 사용하면 테이블의 파티션 한도를 유지하는 데 도움이 됩니다.
테이블에 단기간(일반적으로 타임스탬프 값이 6개월 미만)에 걸쳐 있는 데이터가 많은 경우 시간별 파티션 나누기를 대신 선택합니다. 시간별 파티션 나누기를 사용하면 특정 파티션에서 데이터를 추가하거나, 자르거나, 삭제하는 경우 등에 시간 단위로 데이터를 처리할 수 있습니다.
테이블의 일별 데이터가 상대적으로 적지만 넓은 날짜 범위를 포괄하는 경우 월별 또는 연간 파티션 나누기를 선택합니다. 워크플로가 광범위한 기간(예: 500개가 넘는 날짜)을 포함하는 행을 자주 업데이트하거나 추가해야 하는 경우 이 파티션 나누기 옵션이 권장됩니다. 이러한 시나리오에서 최고의 성능을 얻으려면 타임스탬프, 날짜 또는 날짜/시간 파티션 나누기 열의 클러스터링과 함께 월간 또는 연간 파티션 나누기를 사용하세요. 자세한 내용과 예시는 클러스터링과 함께 시간 단위 파티션 나누기를 참조하세요.
스키마 정의가 있는 파티션을 나눈 빈 테이블 만들기
스키마 정의가 없는 파티션을 나눈 빈 테이블은 만들 수 없습니다. 파티션을 만드는 데 사용한 열을 확인하려면 스키마가 있어야 합니다.
스키마 정의가 있는 파티션을 나눈 빈 테이블을 만들 때는 다음 작업을 할 수 있습니다.
bq
명령줄 도구를 사용하여 스키마를 인라인으로 제공합니다.bq
명령줄 도구를 사용하여 JSON 스키마 파일을 지정합니다.- API의
tables.insert
메서드를 호출할 때 테이블 리소스에 스키마를 제공합니다.
테이블 스키마 지정에 대한 자세한 내용은 스키마 지정을 참조하세요.
파티션을 나눈 테이블이 생성되면 다음 작업을 수행할 수 있습니다.
- 데이터를 테이블에 로드하기
- 쿼리 결과를 테이블에 쓰기
- 데이터를 테이블에 복사하기
스키마 정의가 있는 파티션을 나눈 빈 테이블을 만들려면 다음 안내를 따르세요.
Console
탐색기 패널에서 프로젝트를 확장하고 데이터 세트를 선택합니다.
세부정보 패널에서 테이블 만들기를 클릭합니다.
테이블 만들기 패널의 소스 섹션에서 다음을 수행합니다.
- 다음 항목으로 테이블 만들기에서 빈 테이블을 선택합니다.
대상 섹션에서 다음을 수행합니다.
- 데이터 세트 이름에서 적절한 데이터 세트를 선택하고, 테이블 이름 필드에 만들려는 테이블의 이름을 입력합니다.
- 테이블 유형이 기본 테이블로 설정되어 있는지 확인합니다.
스키마 섹션에 스키마 정의를 입력합니다. 다음 중 하나를 수행하여 수동으로 스키마 정보를 입력합니다.
텍스트로 편집을 사용 설정하고 테이블 스키마를 JSON 배열로 입력합니다.
필드 추가를 클릭하고 스키마 정보를 입력합니다.
파티션 및 클러스터 설정에서 파티션 없음을 클릭하고, 필드로 파티션 나누기를 선택한 다음
DATE
,TIMESTAMP
또는DATETIME
열을 선택합니다. 스키마에DATE
,TIMESTAMP
또는DATETIME
열이 포함되지 않은 경우에는 이 옵션을 사용할 수 없습니다.(선택사항) 사용자가 쿼리할 파티션을 지정하는
WHERE
절을 반드시 포함하도록 하려면 파티션 필터에서 파티션 필터 필요 상자를 클릭합니다. 파티션 필터를 필수항목으로 설정하면 비용을 줄이고 성능을 높일 수 있습니다. 자세한 내용은 파티션을 나눈 테이블 쿼리를 참조하세요.(선택사항) Cloud Key Management Service 키를 사용하려면 고급 옵션을 클릭하고 암호화에서 고객 관리 키를 클릭합니다. Google 관리 키 설정을 그대로 두면 BigQuery는 저장 데이터를 암호화합니다.
테이블 만들기를 클릭합니다.
SQL
데이터 정의 언어(DDL) 문을 사용하면 표준 SQL 쿼리 구문을 사용하여 테이블과 뷰를 만들고 수정할 수 있습니다.
자세한 내용은 데이터 정의 언어 문 사용을 참조하세요.
Cloud Console에서 DDL 문을 사용하여 파티션을 나눈 테이블을 만들려면 다음 단계를 따르세요.
Cloud Console에서 BigQuery 페이지를 엽니다.
새 쿼리 작성을 클릭합니다.
쿼리 편집기 텍스트 영역에
CREATE TABLE
DDL 문을 입력합니다.다음 쿼리는
transaction_date
DATE
열을 기준으로 하는 일일 파티션, 파티션 만료 시간이 3일인newtable
이라는 테이블을 만듭니다.CREATE TABLE mydataset.newtable (transaction_id INT64, transaction_date DATE) PARTITION BY transaction_date OPTIONS ( partition_expiration_days=3, description="a table partitioned by transaction_date" )
테이블을 쿼리할 때 파티션 필터를 요구하려면
OPTIONS
절에require_partition_filter=true
를 포함합니다.다음 쿼리는 동일한 테이블을 만드는 대신 시간별 파티션을 포함합니다.
TIMESTAMP_TRUNC
를 사용하여 시간 표시에 타임스탬프를 표시합니다.CREATE TABLE mydataset.newtable (transaction_id INT64, transaction_ts TIMESTAMP) PARTITION BY TIMESTAMP_TRUNC(transaction_ts, HOUR) OPTIONS ( partition_expiration_days=3, description="a table partitioned by transaction_ts" )
다음 쿼리는 동일한 테이블을 만드는 대신 월별로 파티션을 나눕니다.
TIMESTAMP_TRUNC
를 사용하여 월 표시에 타임스탬프를 표시합니다.CREATE TABLE mydataset.newtable (transaction_id INT64, transaction_ts TIMESTAMP) PARTITION BY TIMESTAMP_TRUNC(transaction_ts, MONTH) OPTIONS ( partition_expiration_days=3, description="a table partitioned by transaction_ts" )
다음 쿼리는 동일한 테이블을 만드는 대신 연도별로 파티션을 나눕니다.
TIMESTAMP_TRUNC
를 사용하여 연도 표시에 타임스탬프를 표시합니다.CREATE TABLE mydataset.newtable (transaction_id INT64, transaction_ts TIMESTAMP) PARTITION BY TIMESTAMP_TRUNC(transaction_ts, YEAR) OPTIONS ( partition_expiration_days=3, description="a table partitioned by transaction_ts" )
실행을 클릭합니다. 쿼리가 완료되면 테이블이 데이터 세트의 테이블 목록에 나타납니다.
bq
bq mk
명령어를 --table
플래그(또는 -t
단축키), --schema
플래그, --time_partitioning_field
플래그와 함께 사용합니다. 테이블의 스키마 정의를 인라인으로 제공하거나 JSON 스키마 파일을 지정하여 제공할 수 있습니다.
선택적 매개변수로는 --expiration
, --description
,
--time_partitioning_expiration
, --destination_kms_key
,
--require_partition_filter
, --time_partitioning_type
, --label
이 있습니다.
기본 프로젝트가 아닌 다른 프로젝트에서 테이블을 만드는 경우 프로젝트 ID를 project_id:dataset
형식으로 데이터 세트에 추가합니다.
여기서는 --destination_kms_key
를 설명하지 않습니다. 이 플래그 사용에 관한 자세한 내용은 Cloud Key Management Service 키로 데이터 보호를 참조하세요.
다음 명령어를 사용하여 스키마 정의가 있는 파티션을 나눈 빈 테이블을 만듭니다.
bq mk --table \ --expiration integer1 \ --schema schema \ --time_partitioning_field column \ --time_partitioning_type unit_time \ --time_partitioning_expiration integer2 \ --[no]require_partition_filter \ --description "description" \ --label key:value, key:value \ project_id:dataset.table
다음을 바꿉니다.
integer1
은 테이블의 기본 수명(단위: 초)입니다. 최솟값은 3,600초(1시간)입니다. 만료 시간은 현재 UTC 시간과 정수 값을 더한 값으로 계산됩니다. 시간으로 파티션을 나눈 테이블을 생성할 때 테이블의 만료 시간을 설정하면 데이터 세트의 기본 테이블 만료 시간 설정은 무시됩니다. 이 값을 설정하면 지정한 시간 이후에 테이블과 모든 파티션이 삭제됩니다.schema
는field:data_type, field:data_type
형식의 인라인 스키마 정의이거나 로컬 머신의 JSON 스키마 파일 경로입니다.column
은 파티션을 만드는 데 사용된TIMESTAMP
,DATETIME
또는DATE
열의 이름입니다.unit_time
는 원하는 시간 단위 파티션 나누기 세부사항을 기준으로 하는DAY
,HOUR
,MONTH
또는YEAR
입니다.time_partitioning_type
이 지정되지 않은 경우 기본값은DAY
입니다.integer2
는 테이블 파티션의 기본 수명(단위: 초)입니다. 최솟값은 없습니다. 만료 시간은 파티션의 날짜와 정수 값을 더한 값입니다. 파티션 만료 시간은 테이블의 만료 시간과 별개이며 테이블 만료 시간보다 우선하지 않습니다. 파티션 만료 시간을 테이블 만료 시간보다 길게 설정하면 테이블 만료 시간이 우선합니다.description
은 따옴표로 묶은 테이블 설명입니다.key:value
는 라벨을 나타내는 키-값 쌍입니다. 쉼표로 구분된 목록을 사용하여 라벨을 여러 개 입력할 수 있습니다.project_id
는 프로젝트 ID입니다.dataset
는 프로젝트의 데이터 세트입니다.table
은 만들고 있는 파티션을 나눈 테이블의 이름입니다.
bq mk
명령어에 대한 상세 정보는 bq mk
를 참조하세요.
bq
명령줄 도구를 사용하여 스키마를 지정할 때는 RECORD
(STRUCT
) 유형을 포함하거나, 열 설명을 포함하거나, 열 모드를 지정할 수 없습니다. 모든 모드는 기본적으로 NULLABLE
로 설정됩니다. 설명, 모드, RECORD
유형을 포함하려면 대신 JSON 스키마 파일을 제공해야 합니다.
예시:
다음 명령어를 입력하여 기본 프로젝트의 mydataset
에 이름이 mypartitionedtable
인 시간별로 파티션을 나눈 테이블을 만듭니다. 파티션 나누기 만료 기간은 86,400초(1일), 테이블 만료 시간은 2,592,000초(30일로 구성된 한 달)로 설정되고 설명은 This is my partitioned table
, 라벨은 organization:development
로 설정됩니다. 이 명령어는 --table
대신 단축형 -t
를 사용합니다.
--require_partition_filter
플래그는 사용자가 쿼리할 파티션을 지정하는 WHERE
절을 포함하도록 요구하기 위해 사용됩니다.
파티션 필터를 필수항목으로 설정하면 비용을 줄이고 성능을 높일 수 있습니다.
자세한 내용은 파티션을 나눈 테이블 쿼리를 참조하세요.
스키마는 ts:TIMESTAMP,column1:STRING,column2:INTEGER,column4:STRING
와 같이 인라인으로 지정됩니다. 지정된 TIMESTAMP
필드 ts
는 시간별로 데이터의 파티션을 나누는 데 사용됩니다. 시간별 파티션 나누기의 경우 DATE
열 대신 TIMESTAMP
또는 DATETIME
열을 사용합니다.
bq mk -t \
--expiration 2592000 \
--schema 'ts:TIMESTAMP,column1:STRING,column2:INTEGER,column4:STRING' \
--time_partitioning_field ts \
--time_partitioning_type HOUR \
--time_partitioning_expiration 86400 \
--require_partition_filter \
--description "This is my partitioned table" \
--label org:dev \
mydataset.mypartitionedtable
다음 명령어를 입력하여 기본 프로젝트가 아닌 myotherproject
에 이름이 mypartitionedtable
인 일별로 파티션을 나눈 테이블을 만듭니다. 파티션 나누기 만료 시간은 259,200초(3일), 설명은 This is my partitioned table
, 라벨은 organization:development
로 설정됩니다. 이 명령어는 --table
대신 단축형 -t
를 사용합니다. 이 명령어는 테이블 만료 시간을 지정하지 않습니다. 데이터 세트에 기본 테이블 만료 시간이 있으면, 그 값이 적용됩니다. 데이터 세트에 기본 테이블 만료 시간이 없으면 테이블이 만료되지 않지만 파티션은 3일 후에 만료됩니다.
스키마는 로컬 JSON 파일 /tmp/myschema.json
에 지정됩니다.
스키마 정의에는 일별로 데이터의 파티션을 나누는 데 사용된 ts
라는 이름의 TIMESTAMP
필드가 포함됩니다.
bq mk -t \
--expiration 2592000 \
--schema /tmp/myschema.json \
--time_partitioning_field ts \
--time_partitioning_type DAY \
--time_partitioning_expiration 86400 \
--description "This is my partitioned table" \
--label org:dev \
myotherproject:mydataset.mypartitionedtable
테이블이 생성되면 bq
명령줄 도구를 사용하여 파티션을 나눈 테이블의 테이블 만료 시간, 파티션 만료 시간, 설명, 라벨을 업데이트할 수 있습니다.
API
timePartitioning
속성과 schema
속성을 지정하는 테이블 리소스가 정의된 tables.insert
메서드를 호출합니다.
Go
이 샘플을 사용해 보기 전에 BigQuery 빠른 시작: 클라이언트 라이브러리 사용의 Go 설정 안내를 따르세요. 자세한 내용은 BigQuery Go API 참조 문서를 확인하세요.
자바
이 샘플을 사용해 보기 전에 BigQuery 빠른 시작: 클라이언트 라이브러리 사용의 자바 설정 안내를 따르세요. 자세한 내용은 BigQuery 자바 API 참조 문서를 확인하세요.
Node.js
이 샘플을 사용해 보기 전에 BigQuery 빠른 시작: 클라이언트 라이브러리 사용의 Node.js 설정 안내를 따르세요. 자세한 내용은 BigQuery Node.js API 참조 문서를 확인하세요.
Python
이 샘플을 사용해 보기 전에 BigQuery 빠른 시작: 클라이언트 라이브러리 사용의 Python 설정 안내를 따르세요. 자세한 내용은 BigQuery Python API 참조 문서를 확인하세요.
쿼리 결과로부터 파티션을 나눈 테이블 만들기
쿼리 결과로부터 파티션을 나눈 테이블을 만들려면 새 대상 테이블에 결과를 기록해야 합니다. 파티션을 나눈 테이블이나 파티션을 나누지 않은 테이블을 쿼리해 파티션을 나눈 테이블을 만들 수 있습니다. 쿼리 결과를 사용하여 기존 표준 테이블을 파티션을 나눈 테이블로 변경할 수는 없습니다.
쿼리 결과에서 파티션을 나눈 테이블을 만들 때는 표준 SQL을 사용해야 합니다. 현재 Legacy SQL은 파티션을 나눈 테이블을 쿼리하거나 쿼리 결과를 파티션을 나눈 테이블에 기록하는 용도로는 사용할 수 없습니다.
파티션 데코레이터를 사용하면 특정 파티션에 쿼리 결과를 기록할 수 있습니다. 예를 들어 결과를 2016년 5월 1일 파티션에 기록하려면 다음 파티션 데코레이터를 사용합니다.
table_name$20160501
파티션 데코레이터를 사용해 쿼리 결과를 특정 파티션에 기록할 때 파티션에 기록되는 데이터는 테이블의 파티션 스키마를 따라야 합니다. 파티션에 기록되는 모든 행은 파티션의 날짜에 속하는 값을 가져야 합니다.
예를 들면 다음과 같습니다.
다음 쿼리는 2018년 2월 1일부터 데이터를 검색하고 데이터를 mytable
테이블의 $20180201
파티션에 기록합니다. 이 테이블에는 TS
라는 TIMESTAMP
열과 a
라는 INT64
열의 두 열이 있습니다.
bq query \
--nouse_legacy_sql \
--destination_table=mytable$20180201 \
'SELECT
TIMESTAMP("2018-02-01") AS TS,
2 AS a'
다음 쿼리는 2018년 1월 31일부터 데이터를 검색하고 이 데이터를 mytable
의 $20180201
파티션에 기록하려고 시도합니다. 이 쿼리는 기록하려고 시도 중인 데이터가 파티션의 날짜 내에 있지 않기 때문에 실패합니다.
bq query \
--nouse_legacy_sql \
--destination_table=T$20180201 \
'SELECT
TIMESTAMP("2018-01-31") as TS,
2 as a'
파티션을 나눈 테이블에서 데이터를 추가하거나 수정(교체)하는 방법은 시간으로 파티션을 나눈 테이블에서 데이터 추가 또는 덮어쓰기를 참조하세요. 파티션을 나눈 테이블 쿼리에 대한 자세한 내용은 파티션을 나눈 테이블 쿼리를 참조하세요.
쿼리 결과로부터 파티션을 나눈 테이블 만들기
쿼리 결과로부터 파티션을 나눈 테이블을 만들려면 다음 안내를 따르세요.
Console
Cloud Console을 사용하여 데이터를 쿼리할 때는 대상 테이블의 파티션 나누기 옵션을 지정할 수 없습니다.
bq
bq query
명령어를 입력하고 --destination_table
플래그를 지정하여 쿼리 결과에 따라 영구 테이블을 만들고 --time_partitioning_field
플래그를 지정하여 파티션을 나눈 대상 테이블을 만듭니다.
표준 SQL 구문을 사용하려면 use_legacy_sql=false
플래그를 지정합니다.
기본 프로젝트에 없는 테이블에 쿼리 결과를 쓰려면 프로젝트 ID를 project_id:dataset
형식으로 데이터 세트 이름에 추가합니다.
(선택사항) --location
플래그를 지정하고 값을 사용자 위치로 설정합니다.
쿼리 결과에서 파티션을 나눈 새 대상 테이블을 만들려면 다음 명령어를 입력합니다.
bq --location=location query \ --destination_table project_id:dataset.table \ --time_partitioning_field column \ --time_partitioning_type unit_time --use_legacy_sql=false \ 'query'
다음을 바꿉니다.
location
은 사용자 위치의 이름입니다.--location
플래그는 선택사항입니다. 예를 들어 도쿄 리전에서 BigQuery를 사용하는 경우 플래그 값을asia-northeast1
로 설정합니다..bigqueryrc
파일을 사용하여 위치 기본값을 설정할 수 있습니다.project_id
는 프로젝트 ID입니다.dataset
는 파티션을 나눈 새 테이블을 포함할 데이터 세트의 이름입니다.table
은 쿼리 결과를 사용하여 생성 중인 파티션을 나눈 테이블의 이름입니다.column
은 파티션을 만드는 데 사용한TIMESTAMP
또는DATE
열의 이름입니다.unit_time
는 원하는 시간 단위 파티션 나누기 세부사항을 기준으로 하는DAY
,HOUR
,MONTH
또는YEAR
입니다.time_partitioning_type
이 지정되지 않은 경우 기본값은DAY
입니다.query
는 표준 SQL 구문의 쿼리입니다. legacy SQL로는 파티션을 나눈 테이블을 쿼리하거나 쿼리 결과를 파티션을 나눈 테이블에 쓸 수 없습니다.
예시:
다음 명령어를 입력하여 mydataset
에 있는 mypartitionedtable
이라는 파티션을 나눈 대상 테이블에 쿼리 결과를 씁니다. 여기서 mydataset
는 기본 프로젝트에 있습니다. 이 쿼리는 파티션을 나누지 않은 테이블인 NHTSA 교통사고 사망률 공개 데이터 세트에서 데이터를 검색합니다.
테이블의 timestamp_of_crash
TIMESTAMP
열은 파티션을 만드는 데 사용됩니다.
bq query \ --destination_table mydataset.mypartitionedtable \ --time_partitioning_field timestamp_of_crash \ --use_legacy_sql=false \ 'SELECT state_number, state_name, day_of_crash, month_of_crash, year_of_crash, latitude, longitude, manner_of_collision, number_of_fatalities, timestamp_of_crash FROM `bigquery-public-data`.nhtsa_traffic_fatalities.accident_2016 LIMIT 100'
다음 명령어를 입력하여 mydataset
에 있는 mypartitionedtable
이라는 파티션을 나눈 대상 테이블에 쿼리 결과를 씁니다. 여기서 mydataset
는 기본 프로젝트가 아닌 myotherproject
에 있습니다. 이 쿼리는 파티션을 나누지 않은 테이블인 NHTSA 교통사고 사망률 공개 데이터 세트에서 데이터를 검색합니다.
테이블의 timestamp_of_crash
TIMESTAMP
열은 파티션을 만드는 데 사용됩니다.
bq query \ --destination_table myotherproject:mydataset.mypartitionedtable \ --time_partitioning_field timestamp_of_crash \ --use_legacy_sql=false \ 'SELECT state_number, state_name, day_of_crash, month_of_crash, year_of_crash, latitude, longitude, manner_of_collision, number_of_fatalities, timestamp_of_crash FROM `bigquery-public-data`.nhtsa_traffic_fatalities.accident_2016 LIMIT 100'
API
쿼리 결과를 파티션을 나눈 영구 테이블에 저장하려면 jobs.insert
메서드를 호출하고, query
작업을 구성하고, destinationTable
및 timePartitioning
속성의 값을 포함합니다.
작업 리소스의 jobReference
섹션에 있는 location
속성에 사용자 위치를 지정합니다.
데이터를 로드할 때 파티션을 나눈 테이블 만들기
데이터를 새 테이블에 로드할 때 파티션 나누기 옵션을 지정하면 파티션을 나눈 테이블을 만들 수 있습니다. 데이터를 로드하기 전에는 파티션을 나눈 빈 테이블을 만들지 않아도 됩니다. 파티션을 나눈 테이블을 만들면서 동시에 데이터를 로드할 수 있습니다.
데이터를 BigQuery로 로드할 때는 테이블 스키마를 제공할 수 있고, 지원되는 데이터 형식에는 스키마 자동 감지를 사용할 수도 있습니다.
파티션 데코레이터를 사용하면 특정 파티션에 데이터를 로드할 수 있습니다. 예를 들어 2016년 5월 1일에 생성된 모든 데이터를 20160501
파티션에 로드하려면 다음 파티션 데코레이터를 사용합니다.
table_name$20160501
파티션 데코레이터를 사용하여 특정 파티션에 데이터를 로드할 때, 파티션에 로드되는 데이터는 테이블의 파티션 나누기 스키마를 따라야 합니다. 파티션에 기록되는 모든 행은 파티션의 날짜에 속하는 값을 가져야 합니다.
데이터 로드에 대한 자세한 내용은 BigQuery에 데이터 로드 소개를 참조하세요.
클러스터링과 함께 시간 단위 파티션 나누기
시간 단위 파티션 나누기는 클러스터링과 함께 사용할 수 있습니다. 클러스터링과 함께 시간 단위 파티션을 나눈 테이블은 먼저 파티션 나누기 열의 시간 단위 경계(일, 시간, 월 또는 연도)에 따라 데이터를 여러 파티션으로 나눕니다. 그런 다음 각 파티션 경계 내에서 데이터는 클러스터링 열에 의해 추가 클러스터링됩니다.
예를 들어 이 명령어는 일별로 파티션을 나눈 열과 클러스터로 테이블을 만듭니다.
bq mk --time_partitioning_type=DAY \ --time_partitioning_field=ts_column \ --clustering_fields=column1,column2 \ mydataset.mytable2 "ts_column:TIMESTAMP,column1:INTEGER,column2:STRING"
테이블 형식을 검색하면 일별 타임스탬프 파티션 나누기와 클러스터링이 모두 적용됩니다.
bq show --format=prettyjson mydataset.mytable2 ... "clustering": { "fields": [ "column1", "column2" ] }, ... "timePartitioning": { "field": "ts_column", "type": "DAY" }, ...
테이블당 파티션 수 한도를 초과하거나 다수의 파티션에 데이터가 너무 적고 데이터를 너무 자주 변형하고 있는 경우에는 동일한 파티션 나누기 열의 클러스터링과 함께 시간 단위 파티션 나누기 간격을 늘려보세요. 이 방법은 파티션 한도를 준수하기 위해 파티션이 나뉜 테이블을 사용할 때 권장됩니다.
예를 들어 이 명령어는 동일한 열에 일별로 파티션을 나누고 클러스터링된 테이블을 만듭니다.
bq mk --time_partitioning_type=DAY \ --time_partitioning_field=ts_column \ --clustering_fields=ts_column,column1 \ mydataset.mytable2 "ts_column:TIMESTAMP,column1:INTEGER,column2:STRING"
다음은 위의 테이블에 대한 또 다른 예시로 시간 단위 파티션 나누기 간격을 더 크게 설정합니다.
bq mk --time_partitioning_type=MONTH \ --time_partitioning_field=ts_column \ --clustering_fields=ts_column,column1 \ mydataset.mytable2 "ts_column:TIMESTAMP,column1:INTEGER,column2:STRING"
파티션을 나눈 테이블에 대한 액세스 제어
테이블 및 뷰에 대한 액세스를 구성하려면 허용되는 리소스 범위 순서(가장 큰 크기부터 가장 작은 크기 순서)대로 나열된 다음 수준의 항목에 IAM 역할을 부여하면 됩니다.
- Google Cloud 리소스 계층 구조의 상위 수준(예: 프로젝트, 폴더 또는 조직 수준)
- 데이터 세트 수준
- 테이블/뷰 수준
IAM으로 보호되는 모든 리소스에 대한 액세스 권한은 적층식입니다. 예를 들어 항목이 프로젝트와 같은 높은 수준에서 액세스할 수 없는 경우 데이터 세트 수준에서 항목에 액세스 권한을 부여하면 해당 항목에서 데이터 세트의 테이블과 뷰에 액세스할 수 있습니다. 마찬가지로, 항목이 높은 수준 또는 데이터 세트 수준에서 액세스할 수 없는 경우 테이블 또는 뷰 수준에서 항목에 액세스 권한을 부여할 수 있습니다.
프로젝트, 폴더 또는 조직 수준과 같이 Google Cloud 리소스 계층 구조의 상위 수준에서 IAM 역할을 부여하면 포괄적인 리소스 집합에 대한 액세스 권한이 항목에 부여됩니다. 예를 들어 프로젝트 수준에서 항목에 역할을 부여하면 프로젝트의 모든 데이터 세트에 적용되는 권한이 항목에 부여됩니다.
데이터 세트 수준에서 역할을 부여하면 항목이 상위 수준에서 액세스할 수 없는 경우에도 특정 데이터 세트의 테이블과 뷰에서 항목이 수행할 수 있는 작업이 지정됩니다. 데이터 세트 수준의 액세스 권한 제어 구성에 대한 자세한 내용은 데이터 세트에 대한 액세스 제어를 참조하세요.
테이블 또는 뷰 수준에서 역할을 부여하면 항목이 상위 수준에서 액세스할 수 없는 경우에도 테이블과 뷰에서 항목이 수행할 수 있는 작업이 지정됩니다. 테이블 수준의 액세스 권한 제어 구성에 대한 자세한 내용은 테이블 및 뷰에 대한 액세스 제어를 참조하세요.
IAM 커스텀 역할을 만들 수도 있습니다. 커스텀 역할을 만들 경우 항목이 수행하도록 하려는 특정 작업에 따라 권한을 부여합니다.
IAM으로 보호되는 리소스에는 '거부' 권한을 설정할 수 없습니다.
역할과 권한에 대한 자세한 내용은 다음을 참조하세요.
- IAM 문서의 역할 이해
- BigQuery 사전 정의된 역할 및 권한
- 데이터 세트에 대한 액세스 제어
- 테이블 및 뷰에 대한 액세스 제어
- BigQuery 열 수준 보안으로 액세스 제한
파티션을 나눈 테이블 사용
파티션을 나눈 테이블 정보 가져오기
다음과 같은 방법으로 테이블에 대한 정보를 가져올 수 있습니다.
- Cloud Console 사용
bq
명령줄 도구에서bq show
명령어 사용tables.get
API 메서드 호출- 클라이언트 라이브러리 사용
필수 권한
테이블에 대한 정보를 가져오려면 최소한 bigquery.tables.get
권한이 부여되어 있어야 합니다. 다음과 같은 사전 정의된 IAM 역할에는 bigquery.tables.get
권한이 포함되어 있습니다.
bigquery.metadataViewer
bigquery.dataViewer
bigquery.dataOwner
bigquery.dataEditor
bigquery.admin
또한 bigquery.datasets.create
권한이 있는 사용자는 데이터 세트를 만들 때 해당 데이터 세트에 대한 bigquery.dataOwner
액세스 권한을 부여받습니다.
bigquery.dataOwner
액세스 권한이 있으면 사용자가 테이블 메타데이터를 검색할 수 있습니다.
BigQuery의 IAM 역할과 권한에 대한 자세한 내용은 액세스 제어를 참조하세요.
파티션을 나눈 테이블 정보 가져오기
파티션을 나눈 테이블 정보를 보려면 다음 안내를 따르세요.
Console
Cloud Console에서 BigQuery 페이지를 엽니다.
탐색기 패널에서 프로젝트와 데이터 세트를 펼친 후 테이블을 선택합니다.
세부정보 패널에서 세부정보를 클릭합니다. 이 탭에 테이블 설명과 테이블 정보가 표시됩니다.
스키마 탭을 클릭하여 테이블의 스키마 정의를 확인합니다. 파티션을 나눈 테이블은
_PARTITIONTIME
유사 열을 포함하지 않습니다.
bq
bq show
명령어를 실행하여 모든 테이블 정보를 표시합니다. 테이블 스키마 정보만 표시하려면 --schema
플래그를 사용합니다. --format
플래그를 사용하면 출력을 제어할 수 있습니다.
기본 프로젝트가 아닌 다른 프로젝트의 테이블에 대한 정보를 가져오려면 프로젝트 ID를 project_id:dataset
형식으로 데이터 세트에 추가합니다.
bq show --schema --format=prettyjson project_id:dataset.table
다음을 바꿉니다.
project_id
는 프로젝트 ID입니다.dataset
는 데이터 세트 이름입니다.table
은 테이블의 이름입니다.
예시:
다음 명령어를 입력하여 mydataset
의 mytable
관련 정보를 모두 표시합니다. 여기서 mydataset
는 기본 프로젝트에 있습니다.
bq show --format=prettyjson mydataset.mytable
다음 명령어를 입력하여 mydataset
의 mytable
관련 정보를 모두 표시합니다. 여기서 mydataset
는 기본 프로젝트가 아닌 myotherproject
에 있습니다.
bq show --format=prettyjson myotherproject:mydataset.mytable
출력은 다음과 같이 표시됩니다.
{ "creationTime": "1563236533535", "description": "This is my partitioned table", "etag": "/ABcDEo7f8GHijKL2mnOpQr==", "expirationTime": "1565828533000", "id": "myproject:mydataset.mypartitionedtable", "kind": "bigquery#table", "labels": { "org": "dev" }, "lastModifiedTime": "1563236533576", "location": "US", "numBytes": "0", "numLongTermBytes": "0", "numRows": "0", "requirePartitionFilter": true, "schema": { "fields": [ { "name": "ts", "type": "TIMESTAMP" }, { "name": "column1", "type": "STRING" }, { "name": "column2", "type": "INTEGER" }, { "name": "column3", "type": "STRING" } ] }, "selfLink": "https://bigquery.googleapis.com/bigquery/v2/projects/myproject/datasets/mydataset/tables/mypartitionedtable", "tableReference": { "datasetId": "mydataset", "projectId": "myproject", "tableId": "mypartitionedtable" }, "timePartitioning": { "expirationMs": "86400000", "field": "ts", "requirePartitionFilter": true, "type": "DAY" }, "type": "TABLE" }
mydataset
의 mytable
관련 스키마 정보만 표시하려면 다음 명령어를 입력합니다. 여기서 mydataset
는 기본 프로젝트가 아닌 myotherproject
에 있습니다.
bq show --schema --format=prettyjson myotherproject:mydataset.mytable
출력은 다음과 같이 표시됩니다.
[ { "name": "ts", "type": "TIMESTAMP" }, { "name": "column1", "type": "STRING" }, { "name": "column2", "type": "INTEGER" }, { "name": "column3", "type": "STRING" } ]
API
bigquery.tables.get
메서드를 호출하고 관련 매개변수를 모두 제공합니다.
데이터 세트의 파티션을 나눈 테이블 나열
다음과 같은 방법으로 데이터 세트의 테이블 (파티션을 나눈 테이블 포함)을 나열할 수 있습니다.
- Cloud Console 사용
bq
명령줄 도구에서bq ls
명령어 사용tables.list
API 메서드 호출- 클라이언트 라이브러리 사용
필수 권한
데이터 세트의 테이블을 나열하려면 최소한 bigquery.tables.list
권한이 부여되어 있어야 합니다. 다음과 같은 사전 정의된 IAM 역할에는 bigquery.tables.list
권한이 포함되어 있습니다.
bigquery.user
bigquery.metadataViewer
bigquery.dataViewer
bigquery.dataEditor
bigquery.dataOwner
bigquery.admin
BigQuery의 IAM 역할과 권한에 대한 자세한 내용은 액세스 제어를 참조하세요.
파티션을 나눈 테이블 나열
데이터 세트의 테이블(파티션을 나눈 테이블 포함)을 나열하려면 다음 안내를 따르세요.
Console
Cloud Console에서 BigQuery 페이지를 엽니다.
탐색기 패널에서 프로젝트를 확장하고 데이터 세트를 선택합니다.
목록을 스크롤하여 데이터 세트의 테이블을 확인합니다. 테이블, 파티션을 나눈 테이블, 모델, 뷰는 서로 다른 아이콘으로 구분됩니다.
bq
bq ls
명령어를 실행합니다. --format
플래그를 사용하면 출력을 제어할 수 있습니다. 기본 프로젝트가 아닌 다른 프로젝트의 테이블을 나열하는 경우 프로젝트 ID를 project_id:dataset
형식으로 데이터 세트에 추가합니다.
bq ls --format=pretty project_id:dataset
다음을 바꿉니다.
project_id
는 프로젝트 ID입니다.dataset
는 데이터 세트 이름입니다.
이 명령어를 실행하면 Type
필드에 TABLE
또는 VIEW
가 표시됩니다. 파티션을 나눈 테이블의 경우에는 Time Partitioning
필드에 DAY
, 파티션을 만들기 위해 사용된 열, 파티션 만료 시간(단위: 밀리초)(만료 기간이 지정된 경우)이 표시됩니다.
예를 들면 다음과 같습니다.
+-------------------------+-------+----------------------+---------------------------------------------------+ | tableId | Type | Labels | Time Partitioning | +-------------------------+-------+----------------------+---------------------------------------------------+ | mytable | TABLE | department:shipping | DAY (field: source_date, expirationMs: 86400000) | | myview | VIEW | | | +-------------------------+-------+----------------------+---------------------------------------------------+
예시:
다음 명령어를 입력하면 기본 프로젝트의 데이터 세트 mydataset
에 있는 테이블이 나열됩니다.
bq ls --format=pretty mydataset
myotherproject
의 데이터 세트 mydataset
에 있는 테이블을 나열하려면 다음 명령어를 입력합니다.
bq ls --format=pretty myotherproject:mydataset
API
API를 사용하여 테이블을 나열하려면 tables.list
메서드를 호출합니다.
파티션 메타데이터 가져오기
다음과 같은 방법으로 파티션을 나눈 테이블에 대한 정보를 가져올 수 있습니다.
INFORMATION_SCHEMA.PARTITIONS
뷰(미리보기)를 사용합니다.__PARTITIONS_SUMMARY__
메타테이블(legacy SQL만 해당)을 사용합니다.
INFORMATION_SCHEMA
뷰를 사용하여 파티션 메타데이터 가져오기
INFORMATION_SCHEMA.PARTITIONS
뷰를 쿼리하면 각 파티션당 하나의 행이 쿼리 결과에 포함됩니다. 예를 들어 다음 쿼리는 mydataset
라는 데이터 세트에 있는 모든 테이블 파티션을 나열합니다.
SELECT table_name, partition_id, total_rows
FROM `mydataset.INFORMATION_SCHEMA.PARTITIONS`
WHERE partition_id IS NOT NULL
자세한 내용은 INFORMATION_SCHEMA.PARTITIONS
를 참조하세요.
메타테이블을 사용하여 파티션 메타데이터 가져오기
legacy SQL에서는 __PARTITIONS_SUMMARY__
메타테이블을 쿼리하여 테이블 파티션에 대한 메타데이터를 가져올 수 있습니다. 메타테이블은 메타데이터가 포함된 읽기 전용 테이블입니다.
다음과 같이 __PARTITIONS_SUMMARY__
메타테이블을 쿼리합니다.
#legacySQL SELECT column FROM [dataset.table$__PARTITIONS_SUMMARY__]
__PARTITIONS_SUMMARY__
메타테이블에는 다음과 같은 열이 있습니다.
값 | 설명 |
---|---|
project_id |
프로젝트 이름입니다. |
dataset_id |
데이터 세트의 이름입니다. |
table_id |
시간으로 파티션을 나눈 테이블의 이름입니다. |
partition_id |
파티션의 이름(날짜)입니다. |
creation_time |
파티션이 생성된 시간이며 1970년 1월 1일 UTC 이후의 밀리초로 표시됩니다. |
last_modified_time |
파티션이 마지막으로 수정된 시간이며 1970년 1월 1일 UTC 이후의 밀리초로 표시됩니다. |
__PARTITIONS_SUMMARY__
메타테이블을 사용하는 쿼리 작업을 실행하려면 최소한 bigquery.jobs.create
권한 및 bigquery.tables.getData
권한을 부여받아야 합니다.
BigQuery의 IAM 역할에 대한 자세한 내용은 액세스 제어를 참조하세요.
다음 단계
- BigQuery의 파티션을 나눈 테이블 지원 개요는 파티션을 나눈 테이블 소개를 참조하세요.
- 내부 데이터화 시간으로 파티션을 나눈 테이블 생성 및 사용을 참조하여 내부 데이터화 시간으로 파티션을 나눈 테이블을 만들고 사용하는 방법을 알아보세요.
- 정수 범위로 파티션을 나눈 테이블을 만들고 사용하는 방법은 정수 범위로 파티션을 나눈 테이블 만들기 및 사용을 참조하세요.
- 파티션을 나눈 테이블을 관리하고 업데이트하는 방법을 알아보려면 파티션을 나눈 테이블 관리를 참조하세요.
- 파티션을 나눈 테이블 쿼리에 대한 자세한 내용은 파티션을 나눈 테이블 쿼리를 참조하세요.