정수 범위로 파티션을 나눈 테이블 만들기 및 사용

이 문서에서는 정수 열로 파티션을 나눈 테이블을 만들고 사용하는 방법을 설명합니다. 다른 유형의 파티션을 나눈 테이블에 대한 자세한 내용은 날짜/타임스탬프로 파티션을 나눈 테이블 만들기 및 사용 또는 수집 시간으로 파티션을 나눈 테이블 만들기 및 사용을 참조하세요.

정수 범위 파티션에 대한 자세한 내용은 정수 범위로 파티션을 나눈 테이블을 참조하세요.

정수 범위로 파티션을 나눈 테이블을 만든 후에는 다음 작업을 수행할 수 있습니다.

  • 테이블 데이터에 대한 액세스 제어
  • 파티션을 나눈 테이블에 대한 정보 가져오기
  • 데이터세트의 파티션을 나눈 테이블 나열
  • 메타테이블을 사용하여 파티션을 나눈 테이블 메타데이터 가져오기

파티션을 나눈 테이블 속성 업데이트, 파티션을 나눈 테이블 복사 및 삭제를 비롯한 파티션을 나눈 테이블 관리에 대한 자세한 내용은 파티션을 나눈 테이블 관리를 참조하세요.

제한사항

정수 범위로 파티션을 나눈 테이블에는 다음과 같은 제한사항이 적용됩니다.

  • 파티션 나누기 열은 INTEGER 열이어야 합니다. 열의 모드는 REQUIREDNULLABLE일 수는 있지만 REPEATED(배열 기반)여서는 안 됩니다.
  • 파티션을 나눈 열은 최상위 필드여야 합니다. RECORD(STRUCT)의 리프 필드는 파티션을 나눈 열로 사용할 수 없습니다.
  • legacy SQL로는 파티션을 나눈 테이블을 쿼리하거나 쿼리 결과를 파티션을 나눈 테이블에 쓸 수 없습니다.

파티션을 나눈 테이블 만들기

다음 방법 중 하나를 사용하여 BigQuery에서 정수 범위로 파티션을 나눈 테이블을 만들 수 있습니다.

  • Cloud Console 또는 기본 웹 UI 사용
  • partition expression을 포함한 PARTITION BY RANGE_BUCKET 절이 있는 DDL CREATE TABLE 문 사용
  • 명령줄 도구의 bq mk 명령어 사용
  • tables.insert API 메서드를 호출하여 프로그래매틱 방식으로 만들기
  • 쿼리 결과에서 만들기
  • 데이터 로드

테이블 이름 지정

BigQuery에서 테이블을 만들 때 테이블 이름은 데이터세트마다 고유해야 합니다. 다음과 같은 테이블 이름을 사용할 수 있습니다.

  • 최대 1,024자
  • 문자(대문자 또는 소문자), 숫자, 밑줄 포함

필수 권한

테이블을 만들려면 최소한 다음 권한이 부여되어 있어야 합니다.

  • 테이블을 만들 수 있는 bigquery.tables.create 권한
  • 로드 작업, 쿼리 작업 또는 복사 작업을 사용하여 테이블에 데이터를 쓸 수 있는 bigquery.tables.updateData 권한
  • 테이블에 데이터를 쓰는 쿼리 작업, 로드 작업, 복사 작업을 실행할 수 있는 bigquery.jobs.create 권한

테이블에 쓰려는 데이터에 액세스하려면 bigquery.tables.getData와 같은 추가 권한이 필요할 수 있습니다.

다음과 같은 사전 정의된 Cloud IAM 역할에는 bigquery.tables.createbigquery.tables.updateData 권한이 모두 포함되어 있습니다.

  • bigquery.dataEditor
  • bigquery.dataOwner
  • bigquery.admin

다음과 같은 사전 정의된 Cloud IAM 역할에는 bigquery.jobs.create 권한이 포함되어 있습니다.

  • bigquery.user
  • bigquery.jobUser
  • bigquery.admin

또한 bigquery.datasets.create 권한이 있는 사용자는 데이터세트를 만들 때 해당 데이터세트에 대한 bigquery.dataOwner 액세스 권한을 부여받습니다. bigquery.dataOwner 액세스 권한이 있는 사용자는 데이터세트에서 테이블을 만들고 업데이트할 수 있습니다.

BigQuery의 Cloud IAM 역할 및 권한에 대한 자세한 내용은 사전 정의된 역할 및 권한을 참조하세요.

스키마 정의가 있는 파티션을 나눈 빈 테이블 만들기

스키마 정의가 없는 파티션을 나눈 빈 테이블은 만들 수 없습니다. 파티션을 만드는 데 사용한 열을 확인하려면 스키마가 있어야 합니다.

스키마 정의가 있는 빈 파티션을 나눈 테이블을 만들 때는 다음 작업을 수행할 수 있습니다.

  • CLI를 사용하여 스키마를 인라인으로 제공합니다.
  • CLI를 사용하여 JSON 스키마 파일을 지정합니다.
  • API의 tables.insert 메서드를 호출할 때 테이블 리소스에 스키마 제공

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

파티션을 나눈 테이블을 만든 후에는 다음 작업을 수행할 수 있습니다.

  • 데이터를 테이블에 로드
  • 쿼리 결과를 테이블에 쓰기
  • 데이터를 테이블에 복사

스키마 정의가 있는 비어 있는 파티션을 나눈 테이블을 만들려면 다음 안내를 따르세요.

Console

  1. Cloud Console에서 BigQuery 웹 UI를 엽니다.
    BigQuery 웹 UI로 이동

  2. 탐색 패널의 리소스 섹션에서 프로젝트를 확장하고 데이터세트를 선택합니다.

  3. 창의 오른쪽에 있는 세부정보 패널에서 테이블 만들기를 클릭합니다.

  4. 테이블 만들기 패널의 소스 섹션에서 다음을 수행합니다.

    • 다음 항목으로 테이블 만들기에서 빈 테이블을 선택합니다.
  5. 대상 섹션에서 다음을 수행합니다.

    • 데이터세트 이름에서 적절한 데이터세트를 선택하고, 테이블 이름 필드에 만들려는 테이블의 이름을 입력합니다.
    • 테이블 유형이 기본 테이블로 설정되어 있는지 확인합니다.
  6. 스키마 섹션에 스키마 정의를 입력합니다.

    • 다음과 같이 스키마 정보를 직접 입력합니다.

      • 텍스트로 편집을 사용 설정하고 테이블 스키마를 JSON 배열로 입력합니다.

      • 필드 추가를 사용하여 스키마를 수동으로 입력합니다.

  7. 파티션 및 클러스터 설정에서 파티션 없음을 클릭하고 필드로 파티션 나누기를 선택한 다음 INTEGER 형식 열을 선택합니다.

  8. start, end, interval 값을 제공합니다.

    • start는 파티션 나누기 범위의 시작(해당 값 포함)입니다.
    • end는 파티션 나누기 범위의 끝(해당 값 포함)입니다.
    • interval은 파티션 내 각 범위의 너비입니다.
  9. (선택사항) 사용자가 쿼리할 파티션을 지정하는 WHERE 절을 반드시 포함하도록 하려면 파티션 필터에서 파티션 필터 필요 상자를 클릭합니다. 파티션 필터를 필수항목으로 설정하면 비용을 줄이고 성능을 높일 수 있습니다. 자세한 내용은 파티션을 나눈 테이블 쿼리를 참조하세요.

  10. (선택사항) 고급 옵션을 클릭하고 암호화에서 Cloud Key Management Service 키를 사용하도록 고객 관리 키를 클릭합니다. Google 관리 키 설정을 그대로 두면 BigQuery는 저장 데이터를 암호화합니다.

  11. 테이블 만들기를 클릭합니다.

DDL

데이터 정의 언어(DDL) 문을 사용하면 표준 SQL 쿼리 구문으로 테이블과 뷰를 만들고 수정할 수 있습니다.

자세한 내용은 데이터 정의 언어 문 사용을 참조하세요.

Cloud Console에서 DDL 문을 사용하여 파티션을 나눈 테이블을 만들려면 다음 단계를 따르세요.

  1. Cloud Console에서 BigQuery 웹 UI를 엽니다.
    Cloud Console로 이동

  2. 새 쿼리 작성을 클릭합니다.

  3. 쿼리 편집기 텍스트 영역에 CREATE TABLE DDL 문을 입력합니다.

    다음 쿼리는 start가 0, end가 100, interval이 10인 customer_id 열에 정수 범위 파티션이 있는 newtable 테이블을 만듭니다.

     CREATE TABLE
       mydataset.newtable
     PARTITION BY
       RANGE_BUCKET(customer_id, GENERATE_ARRAY(0, 100, 10))
     AS SELECT 1 AS customer_id, DATE "2019-10-01" AS date1
     

  4. 실행을 클릭합니다. 쿼리가 완료되면 테이블이 리소스 창에 나타납니다.

CLI

mk 명령어를 --range_partitioning 플래그와 함께 사용합니다.

bq mk \
--range_partitioning=column_name,start,end,interval \
project_id:dataset.table \
"column_name:integer,value:integer"

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

  • column_name은 정수 범위 파티션을 만드는 데 사용되는 열입니다.
  • start는 파티션 나누기 범위의 시작(해당 값 포함)입니다.
  • end는 파티션 나누기 범위의 끝(해당 값 포함)입니다.
  • interval은 파티션 내 각 범위의 너비입니다.
  • project_id는 프로젝트 ID입니다.
  • dataset는 프로젝트의 데이터세트입니다.
  • table은 만들려는 파티션을 나눈 테이블의 이름입니다.

예:

다음 명령어를 입력하여 기본 프로젝트의 mydatasetmypartitionedtable라는 이름의 정수 범위로 파티션을 나눈 테이블을 만듭니다. 파티션 나누기는 start 0, end 100, interval 10을 기준으로 합니다.

--require_partition_filter 플래그는 사용자가 쿼리할 파티션을 지정하는 WHERE 절을 포함하도록 요구하기 위해 사용됩니다. 파티션 필터를 필수항목으로 설정하면 비용을 줄이고 성능을 높일 수 있습니다. 자세한 내용은 파티션을 나눈 테이블 쿼리를 참조하세요.

bq mk \
--require_partition_filter \
--range_partitioning=customer_id,0,100,10 \
mydataset.mypartitionedtable \
"customer_id:integer,value:integer"

테이블이 생성된 후 CLI를 사용하여 파티션을 나눈 테이블의 테이블 만료, 파티션 만료, 설명, 라벨을 업데이트할 수 있습니다.

API

rangePartitioning 속성 및 schema 속성을 지정하는 테이블 리소스가 정의된 tables.insert 메서드를 호출합니다.

테이블의 파티션이 정수 열을 기준으로 나누어졌는지 확인하려면 스키마를 검사합니다. 예를 들어 다음 명령어를 실행합니다.

bq show --format=prettyjson my_dataset.my_table

정수 열의 파티션을 나눈 경우 bq show의 출력에 rangePartitioning 데이터가 포함됩니다.

...
  "rangePartitioning": {
    "field": "customer_id",
    "range": {
      "end": "100",
      "interval": "10",
      "start": "0"
    }
  },
...

정수 범위로 파티션을 나눈 테이블에 쓰기

정수 범위로 파티션을 나눈 테이블에 작성된 데이터는 자동으로 파티션을 나눕니다. 여기에는 로드 작업, 쿼리, 스트리밍을 통해 테이블에 쓰는 작업도 포함됩니다.

스트리밍의 경우 스트리밍 버퍼에 있는 데이터는 UNPARTITIONED 파티션에 있습니다. 데이터가 추출되면 처음에는 UNPARTITIONED 파티션에 유지됩니다. 파티션으로 나누지 않은 데이터가 충분한 경우 특정 파티션으로 다시 파티션을 나눕니다.

쿼리 결과를 정수 범위로 파티션을 나눈 테이블에 저장하는 예시는 다음과 같습니다.

bq query --nouse_legacy_sql \
--destination_table=my_dataset.my_table \
'SELECT value AS customer_id, value+1 AS value FROM UNNEST(GENERATE_ARRAY(-5, 110, 5)) AS value'

정수 범위로 파티션을 나눈 테이블 쿼리하기

정수 범위로 파티션을 나눈 테이블은 표준 SQL을 통해서만 쿼리할 수 있습니다. 정수 범위로 파티션을 나눈 테이블을 쿼리할 때 정수로 파티션을 나눈 열에 필터가 있는 경우 필터를 사용하여 파티션을 프루닝하고 쿼리 비용을 줄입니다.

다음 쿼리는 30, 40, 50으로 시작하는 3개의 파티션을 검사합니다.

bq query --nouse_legacy_sql \
'SELECT * FROM my_dataset.my_table WHERE customer_id BETWEEN 30 AND 50'

다음은 bq query 명령어의 출력 예시입니다.

Waiting on bqjob_r4fce65fa3381528e_000001670994aeb6_1 ... (0s) Current status: DONE
+---------+-------+
| customer_id | value |
+---------+-------+
|      40 |    41 |
|      45 |    46 |
|      30 |    31 |
|      35 |    36 |
|      50 |    51 |
+---------+-------+

이 예시에서는 각 파티션에 2개의 행이 있고 각 행에는 2개의 정수 열이 있으므로 쿼리는 3 * 2 * 2 * 8 = 96바이트를 검사해야 합니다. 작업 정보를 검사할 수 있습니다.

bq show -j bqjob_r4fce65fa3381528e_000001670994aeb6_1

다음은 bq show 명령어의 출력 예시입니다.

Job myproject:bqjob_r4fce65fa3381528e_000001670994aeb6_1

  Job Type    State      Start Time      Duration       User Email        Bytes Processed   Bytes Billed   Billing Tier   Labels
 ---------- --------- ----------------- ---------- --------------------- ----------------- -------------- -------------- --------
  query      SUCCESS   24 Sep 12:19:58   0:00:01    joe@google.com       96                10485760       1

DML 문이 지원됩니다. 예를 들면 다음과 같습니다.

bq query --nouse_legacy_sql \
'DELETE FROM my_dataset.my_table WHERE customer_id = 30'

현재 정수 범위로 파티션을 나눈 열의 함수에는 파티션 프루닝이 지원되지 않습니다. 예를 들어 다음 쿼리는 전체 테이블을 검사합니다.

bq query --nouse_legacy_sql \
'SELECT * FROM my_dataset.my_table WHERE customer_id+1 BETWEEN 30 AND 50'

정수 범위로 파티션을 나눈 테이블의 테이블 데코레이터

날짜/타임스탬프 파티션 나누기와 마찬가지로 테이블 데코레이터는 정수 범위로 파티션을 나눈 테이블의 파티션을 처리하는 데 사용할 수 있습니다. 범위 파티션을 처리하는 핵심은 범위의 시작입니다.

다음 예시에서는 0으로 시작하는 범위 파티션을 쿼리합니다. 여기에는 0과 5의 2개 값이 있습니다.

bq query 'SELECT * FROM my_dataset.my_table$0'

+---------+-------+
| customer_id | value |
+---------+-------+
|       0 |     1 |
|       5 |     6 |
+---------+-------+

클러스터링과 함께 정수 범위 파티션 나누기

클러스터링과 함께 정수 범위 파티션 나누기를 사용할 수 있습니다. 데이터는 먼저 정수 범위로 파티션을 나눈 열에서 파티션을 나누고 각 파티션의 데이터는 클러스터링 열에 의에 클러스터링됩니다.

예를 들어 다음 명령어는 정수 범위 열과 클러스터가 있는 테이블을 만듭니다.

bq mk \
--range_partitioning=customer_id,0,100,10 \
--clustering_fields=value \
my_dataset.my_table_2 \
"customer_id:integer,value:integer"

테이블 형식을 검색하면 범위 파티션 나누기와 클러스터링이 모두 적용됩니다.

...
  "clustering": {
    "fields": [
      "value"
    ]
  },
...
  "rangePartitioning": {
    "field": "customer_id",
    "range": {
      "end": "100",
      "interval": "10",
      "start": "0"
    }
  },
...

쿼리 결과에서 파티션을 나눈 테이블 만들기

쿼리 결과로부터 파티션을 나눈 테이블을 만들려면 다음 안내를 따르세요.

Console

Cloud Console을 사용하여 데이터를 쿼리할 때는 대상 테이블의 파티션 나누기 옵션을 지정할 수 없습니다.

CLI

bq query 명령어를 입력하고 --destination_table 플래그를 지정하여 쿼리 결과에 따라 영구 테이블을 만들고 --range_partitioning 플래그를 지정하여 파티션을 나눈 대상 테이블을 만듭니다.

표준 SQL 구문을 사용하려면 use_legacy_sql=false 플래그를 지정합니다. 기본 프로젝트에 없는 테이블에 쿼리 결과를 쓰려면 프로젝트 ID를 project_id:dataset 형식으로 데이터세트 이름에 추가합니다.

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

쿼리 결과에서 파티션을 나눈 새 대상 테이블을 만들려면 다음 명령어를 입력합니다.

bq --location=location query \
--destination_table project_id:dataset.table \
--range_partitioning column,start,end,interval \
--use_legacy_sql=false \
'query'

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

  • location은 사용자 위치의 이름입니다. --location 플래그는 선택사항입니다. 예를 들어 도쿄 위치에서 BigQuery를 사용하는 경우 플래그 값을 asia-northeast1로 설정합니다. .bigqueryrc 파일을 사용하여 위치 기본값을 설정할 수 있습니다.
  • project_id는 프로젝트 ID입니다.
  • dataset는 새 파티션을 나눈 테이블을 포함할 데이터세트의 이름입니다.
  • table은 쿼리 결과를 사용하여 생성 중인 파티션을 나눈 테이블의 이름입니다.
  • column은 파티션에 사용할 정수 열입니다.
  • start는 파티션 나누기 범위의 시작(해당 값 포함)입니다.
  • end는 파티션 나누기 범위의 끝(해당 값 포함)입니다.
  • interval은 파티션 내 각 범위의 너비입니다.
  • query는 표준 SQL 구문의 쿼리입니다. 현재는 legacy SQL을 사용하여 파티션을 나눈 테이블을 쿼리하거나 쿼리 결과를 파티션을 나눈 테이블에 기록할 수 없습니다.

예:

다음 명령어를 입력하여 mydataset에 있는 mypartitionedtable이라는 파티션을 나눈 대상 테이블에 쿼리 결과를 씁니다. 여기서 mydataset는 기본 프로젝트에 있습니다. 이 쿼리는 파티션을 나누지 않은 테이블인 NHTSA 교통사고 사망률 공개 데이터세트에서 데이터를 검색합니다. 테이블의 provider_id INTEGER 열은 파티션을 만드는 데 사용됩니다.

bq query \
--destination_table mydataset.mypartitionedtable \
--use_legacy_sql=false \
--range_partitioning provider_id,10000,700000,10000 \
'SELECT
   provider_id, total_discharges, average_covered_charges
 FROM
   `bigquery-public-data`.medicare.inpatient_charges_2011
 LIMIT
   300'

API

쿼리 결과를 파티션을 나눈 영구 테이블에 저장하려면 jobs.insert 메서드를 호출하고, query 작업을 구성하고, destinationTablerangePartitioning 속성의 값을 포함합니다.

작업 리소스jobReference 섹션에 있는 location 속성에 사용자 위치를 지정합니다.

데이터를 로드할 때 파티션을 나눈 테이블 만들기

데이터를 새 테이블에 로드할 때 파티션 나누기 옵션을 지정하면 파티션을 나눈 테이블을 만들 수 있습니다. 데이터를 로드하기 전에는 파티션을 나눈 빈 테이블을 만들지 않아도 됩니다. 파티션을 나눈 테이블을 만들면서 동시에 데이터를 로드할 수 있습니다.

데이터를 BigQuery로 로드할 때는 테이블 스키마를 제공할 수 있고, 지원되는 데이터 형식에는 스키마 자동 감지를 사용할 수 있습니다.

파티션 데코레이터를 사용하면 특정 파티션에 데이터를 로드할 수 있습니다. 예를 들어 start가 0이고, end가 100이고 Interval이 10인 customer_id 열에서 정수 범위로 파티션을 나눈 테이블을 고려해 보세요. 0~9 범위의 고객 ID에 대한 모든 데이터를 로드하려면 다음 $0 파티션 데코레이터를 사용합니다.

table_name$0

파티션 데코레이터를 사용하여 특정 파티션에 데이터를 로드할 때, 파티션에 로드되는 데이터는 테이블의 파티션 나누기 스키마를 따라야 합니다. 파티션에 기록되는 모든 행은 파티션의 날짜에 속하는 값을 가져야 합니다.

데이터 로드에 대한 자세한 내용은 BigQuery에 데이터 로드 소개를 참조하세요.

파티션을 나눈 테이블에 대한 액세스 제어

테이블이나 보기에 액세스 제어를 직접 할당할 수는 없습니다. 액세스 권한을 부여할 수 있는 최저 BigQuery 리소스 수준은 데이터세트 수준입니다. 테이블 및 뷰에 대한 액세스 권한을 구성하려면 데이터세트 수준 이상에서 항목에 Cloud IAM 역할을 부여합니다.

데이터세트 수준에서 역할을 부여하면 특정 데이터세트의 테이블과 뷰에서 항목이 수행할 수 있는 작업이 지정됩니다. 데이터세트 수준의 액세스 권한 제어 구성에 대한 자세한 내용은 데이터세트에 대한 액세스 제어를 참조하세요.

프로젝트, 폴더, 조직 수준과 같이 Google Cloud 리소스 계층 구조의 상위 수준에서 Cloud IAM 역할을 부여할 수도 있습니다. 상위 수준에서 역할을 부여하면 항목이 더욱 다양한 리소스에 액세스할 수 있습니다. 예를 들어 프로젝트 수준에서 항목에 역할을 부여하면 프로젝트의 모든 데이터세트에 적용되는 권한이 항목에 부여됩니다. 리소스에 대한 액세스 권한 부여 방법에 대한 자세한 내용은 Cloud IAM 문서의 리소스에 대한 액세스 권한 부여, 변경, 취소를 참조하세요.

Cloud IAM 커스텀 역할을 만들 수도 있습니다. 커스텀 역할을 만들 경우 항목이 수행하도록 하려는 특정 작업에 따라 권한을 부여합니다.

역할과 권한에 대한 자세한 내용은 다음을 참조하세요.

파티션을 나눈 테이블 사용

파티션을 나눈 테이블 정보 가져오기

다음과 같은 방법으로 테이블에 대한 정보를 가져올 수 있습니다.

  • Cloud Console 또는 기본 BigQuery 웹 UI 사용
  • bq show CLI 명령어 사용
  • tables.get API 메서드 호출
  • 클라이언트 라이브러리 사용

필수 권한

테이블에 대한 정보를 가져오려면 최소한 bigquery.tables.get 권한이 부여되어 있어야 합니다. 다음과 같은 사전 정의된 Cloud IAM 역할에는 bigquery.tables.get 권한이 포함되어 있습니다.

  • bigquery.metadataViewer
  • bigquery.dataViewer
  • bigquery.dataOwner
  • bigquery.dataEditor
  • bigquery.admin

또한 bigquery.datasets.create 권한이 있는 사용자는 데이터세트를 만들 때 해당 데이터세트에 대한 bigquery.dataOwner 액세스 권한을 부여받습니다. bigquery.dataOwner 액세스 권한이 있으면 사용자가 테이블 메타데이터를 검색할 수 있습니다.

BigQuery의 Cloud IAM 역할 및 권한에 대한 자세한 내용은 액세스 제어를 참조하세요.

파티션을 나눈 테이블 정보 가져오기

파티션을 나눈 테이블 정보를 보려면 다음 안내를 따르세요.

Console

  1. Cloud Console에서 BigQuery 웹 UI를 엽니다.
    BigQuery 웹 UI로 이동

  2. 탐색 패널의 리소스 섹션에서 프로젝트와 데이터세트를 펼친 후 목록에서 테이블 이름을 클릭합니다.

  3. 쿼리 편집기 아래에서 세부정보를 클릭합니다. 이 탭에 테이블 설명과 테이블 정보가 표시됩니다.

    테이블 세부정보

  4. 스키마 탭을 클릭하여 테이블의 스키마 정의를 확인합니다. 파티션을 나눈 테이블은 _PARTITIONTIME 유사 열을 포함하지 않습니다.

CLI

bq show 명령어를 실행하여 모든 테이블 정보를 표시합니다. 테이블 스키마 정보만 표시하려면 --schema 플래그를 사용합니다. --format 플래그를 사용하면 출력을 제어할 수 있습니다.

기본 프로젝트가 아닌 프로젝트의 테이블에 대한 정보를 가져오려면 프로젝트 ID를 project_id:dataset 형식으로 데이터세트에 추가합니다.

bq show --schema --format=prettyjson project_id:dataset.table

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

  • project_id는 프로젝트 ID입니다.
  • dataset는 데이터세트 이름입니다.
  • table은 테이블 이름입니다.

예:

다음 명령어를 입력하여 mydatasetmytable 관련 정보를 모두 표시합니다. 여기서 mydataset는 기본 프로젝트에 있습니다.

bq show --format=prettyjson mydataset.mytable

다음 명령어를 입력하여 mydatasetmytable 관련 정보를 모두 표시합니다. mydataset는 기본 프로젝트가 아닌 myotherproject에 있습니다.

bq show --format=prettyjson myotherproject:mydataset.mytable

출력은 다음과 같이 표시됩니다.

{
  "creationTime": "1569429717657",
  "etag": "AcSEmWFQdbYEGT0auTE9NA==",
  "id": "myproject:mydataset.newtable",
  "kind": "bigquery#table",
  "lastModifiedTime": "1569429717657",
  "location": "US",
  "numBytes": "16",
  "numLongTermBytes": "0",
  "numRows": "1",
  "rangePartitioning": {
    "field": "customer_id",
    "range": {
      "end": "100",
      "interval": "10",
      "start": "0"
    }
  },
  "schema": {
    "fields": [
      {
        "name": "customer_id",
        "type": "INTEGER"
      },
      {
        "name": "date1",
        "type": "DATE"
      }
    ]
  },
  "selfLink": "https://bigquery.googleapis.com/bigquery/v2/projects/myproject/datasets/mydataset/tables/newtable",
  "tableReference": {
    "datasetId": "mydataset,
    "projectId": "myproject",
    "tableId": "newtable"
  },
  "type": "TABLE"
}

API

tables.get 메서드를 호출하고 관련 매개변수를 모두 제공합니다.

데이터세트의 파티션을 나눈 테이블 나열

파티션을 나눈 테이블을 포함하여 데이터세트의 테이블을 나열하는 방법은 다음과 같습니다.

  • Cloud Console 또는 기본 BigQuery 웹 UI 사용
  • bq ls CLI 명령어 사용
  • tables.list API 메서드 호출
  • 클라이언트 라이브러리 사용

필수 권한

데이터세트의 테이블을 나열하려면 최소한 bigquery.tables.list 권한이 부여되어 있어야 합니다. 다음과 같은 사전 정의된 Cloud IAM 역할에는 bigquery.tables.list 권한이 포함되어 있습니다.

  • bigquery.user
  • bigquery.metadataViewer
  • bigquery.dataViewer
  • bigquery.dataEditor
  • bigquery.dataOwner
  • bigquery.admin

BigQuery의 Cloud IAM 역할 및 권한에 대한 자세한 내용은 액세스 제어를 참조하세요.

파티션을 나눈 테이블 나열

데이터세트의 테이블(파티션을 나눈 테이블 포함)을 나열하려면 다음 안내를 따르세요.

Console

  1. Cloud Console에서 BigQuery 웹 UI를 엽니다.
    BigQuery 웹 UI로 이동

  2. 탐색 패널의 리소스 섹션에서 프로젝트를 확장하고 데이터세트를 클릭합니다.

  3. 목록을 스크롤하여 데이터세트의 테이블을 확인합니다. 테이블, 파티션을 나눈 테이블, 모델, 뷰는 서로 다른 아이콘으로 구분됩니다.

API

API를 사용하여 테이블을 나열하려면 tables.list 메서드를 호출합니다.

파티션을 나눈 테이블의 파티션 나열

legacy SQL을 사용하여 __PARTITIONS_SUMMARY__ 메타테이블을 쿼리하면 파티션을 나눈 테이블의 파티션을 나열할 수 있습니다.

Cloud Console, 기본 BigQuery 웹 UI, bq query 명령어를 사용하거나, jobs.insert 메서드를 호출하고 query 작업을 구성하여 쿼리를 실행할 수 있습니다.

필수 권한

__PARTITIONS_SUMMARY__ 메타테이블을 사용하는 쿼리 작업을 실행하려면 최소한 bigquery.jobs.create 권한이 부여되어 있어야 합니다. 다음과 같은 사전 정의된 Cloud IAM 역할에는 bigquery.jobs.create 권한이 포함되어 있습니다.

  • bigquery.user
  • bigquery.jobUser
  • bigquery.admin

bigquery.tables.getData 권한도 부여받아야 합니다. 다음과 같은 사전 정의된 Cloud IAM 역할에는 bigquery.tables.getData 권한이 포함되어 있습니다.

  • bigquery.dataViewer
  • bigquery.dataEditor
  • bigquery.dataOwner
  • bigquery.admin

BigQuery의 Cloud IAM 역할에 대한 자세한 내용은 액세스 제어를 참조하세요.

파티션을 나눈 테이블의 파티션 나열

Legacy SQL을 사용하면 파티션을 나눈 테이블의 파티션을 나열할 수 있습니다. 파티션을 나눈 테이블의 파티션을 나열하려면 다음 안내를 따르세요.

Console

  1. Cloud Console에서 BigQuery 웹 UI를 엽니다.
    Cloud Console로 이동

  2. 새 쿼리 작성 버튼을 클릭합니다.

  3. 쿼리 편집기 상자에 다음 텍스트를 입력하여 __PARTITIONS_SUMMARY__ 메타테이블을 쿼리합니다.

    #legacySQL
    SELECT
      partition_id
    FROM
      [dataset.table$__PARTITIONS_SUMMARY__]
    

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

    • dataset는 테이블을 포함하는 데이터세트입니다.
    • table은 테이블의 이름입니다.
  4. 실행을 클릭합니다.

CLI

bq query 명령어를 사용하여 다음 쿼리를 입력합니다.

bq --location=location query \
--use_legacy_sql=true \
'SELECT
  partition_id
FROM
  [dataset.table$__PARTITIONS_SUMMARY__]'

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

  • location은 사용자 위치의 이름입니다. --location 플래그는 선택사항입니다. 예를 들어 도쿄 위치에서 BigQuery를 사용하는 경우 플래그 값을 asia-northeast1로 설정합니다. .bigqueryrc 파일을 사용하여 위치 기본값을 설정할 수 있습니다.
  • dataset는 테이블을 포함하는 데이터세트입니다.
  • table은 테이블 이름입니다.

API

jobs.insert 메서드를 호출하고 테이블의 __PARTITIONS_SUMMARY__ 메타테이블을 쿼리하는 query 작업을 구성합니다.

메타테이블을 사용하여 파티션을 나눈 테이블 메타데이터 가져오기

메타테이블이라고 부르는 특수한 테이블을 사용하여 파티션을 나눈 테이블에 대한 정보를 가져올 수 있습니다. 메타테이블에는 데이터세트에 있는 테이블 및 보기 목록과 같은 메타데이터가 포함됩니다. 메타테이블은 읽기 전용입니다.

현재는 INFORMATION_SCHEMA 서비스를 사용하여 파티션을 나눈 테이블 메타데이터를 가져올 수 없습니다.

메타테이블을 사용하여 파티션 메타데이터 가져오기

__PARTITIONS_SUMMARY__ 메타테이블은 시간으로 파티션을 나눈 테이블의 파티션 관련 메타데이터를 나타내는 콘텐츠가 있는 특수한 테이블입니다. __PARTITIONS_SUMMARY__ 메타테이블은 읽기 전용입니다.

시간으로 파티션을 나눈 테이블의 파티션과 관련 메타데이터에 액세스하려면 쿼리의 SELECT 문에서 __PARTITIONS_SUMMARY__ 메타테이블을 사용합니다. 쿼리를 실행할 수 있는 방법은 다음과 같습니다.

  • Cloud Console 또는 기본 BigQuery 웹 UI 사용
  • 명령줄 도구의 bq query 명령어 사용
  • jobs.insert API 메서드를 호출하고 query 작업 구성
  • 클라이언트 라이브러리 사용

현재 표준 SQL은 파티션 데코레이터 구분자($)를 지원하지 않으므로 표준 SQL에서 __PARTITIONS_SUMMARY__를 쿼리할 수 없습니다. __PARTITIONS_SUMMARY__ 메타테이블을 사용하는 legacy SQL 쿼리는 다음과 같습니다.

SELECT
  column
FROM
  [dataset.table$__PARTITIONS_SUMMARY__]

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

  • dataset는 데이터세트 이름입니다.
  • table은 시간으로 파티션을 나눈 테이블의 이름입니다.
  • column은 다음 중 하나입니다.
설명
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 권한이 부여되어 있어야 합니다. 다음과 같은 사전 정의된 Cloud IAM 역할에는 bigquery.jobs.create 권한이 포함되어 있습니다.

  • bigquery.user
  • bigquery.jobUser
  • bigquery.admin

bigquery.tables.getData 권한도 부여받아야 합니다. 다음과 같은 사전 정의된 Cloud IAM 역할에는 bigquery.tables.getData 권한이 포함되어 있습니다.

  • bigquery.dataViewer
  • bigquery.dataEditor
  • bigquery.dataOwner
  • bigquery.admin

BigQuery의 Cloud IAM 역할에 대한 자세한 내용은 액세스 제어를 참조하세요.

파티션 메타테이블 예시

다음 쿼리는 이름이 mydataset.mytable이고 범위로 파티션을 나눈 테이블의 모든 파티션 메타데이터를 검색합니다.

Console

#legacySQL
SELECT
  *
FROM
  [mydataset.mytable$__PARTITIONS_SUMMARY__]

CLI

bq query --use_legacy_sql=true '
SELECT
  *
FROM
  [mydataset.mytable$__PARTITIONS_SUMMARY__]'

출력 결과는 다음과 같습니다.

+----------------+------------+----------------+--------------+---------------+--------------------+
|   project_id   | dataset_id |    table_id    | partition_id | creation_time | last_modified_time |
+----------------+------------+----------------+--------------+---------------+--------------------+
| myproject      | mydataset  | mytable        | 10000        | 1517190224120 | 1517190224997      |
| myproject      | mydataset  | mytable        | 20000        | 1517190224120 | 1517190224997      |
+----------------+------------+----------------+--------------+---------------+--------------------+

다음 쿼리는 mydataset.mytable의 파티션이 마지막으로 수정된 시간을 나열합니다.

Console

#legacySQL
SELECT
  partition_id,
  last_modified_time
FROM
  [mydataset.mytable$__PARTITIONS_SUMMARY__]

CLI

bq query --use_legacy_sql=true '
SELECT
  partition_id,
  last_modified_time
FROM
  [mydataset.mytable$__PARTITIONS_SUMMARY__]'

출력 결과는 다음과 같습니다.

+--------------+--------------------+
| partition_id | last_modified_time |
+--------------+--------------------+
| 100000       |      1471632556179 |
| 20000        |      1471632538142 |
| 30000        |      1471632570463 |
+--------------+--------------------+

last_modified_time 필드를 사람이 읽을 수 있는 형식으로 표시하려면 FORMAT_UTC_USEC 함수를 사용합니다. 예를 들면 다음과 같습니다.

Console

#legacySQL
SELECT
  partition_id,
  FORMAT_UTC_USEC(last_modified_time*1000) AS last_modified
FROM
  [mydataset.table1$__PARTITIONS_SUMMARY__]

CLI

bq query --use_legacy_sql=true '
SELECT
  partition_id,
  FORMAT_UTC_USEC(last_modified_time*1000) AS last_modified
FROM
  [mydataset.mytable$__PARTITIONS_SUMMARY__]'

출력 결과는 다음과 같습니다.

+--------------+----------------------------+
| partition_id |       last_modified        |
+--------------+----------------------------+
| 10000        | 2016-08-19 18:49:30.463000 |
| 20000        | 2016-08-19 18:49:16.179000 |
| 30000        | 2016-08-19 18:48:58.142000 |
+--------------+----------------------------+

다음 단계