표 관리

이 문서에서는 BigQuery에서 테이블을 관리하는 방법을 설명합니다. BigQuery 테이블을 관리할 수 있는 방법은 다음과 같습니다.

  • 테이블의 다음 속성 업데이트
    • 만료 시간
    • 설명
    • 스키마 정의
    • 라벨
  • 테이블의 이름 바꾸기(복사)
  • 테이블 복사
  • 테이블 삭제
  • 삭제된 테이블 복원

테이블 정보 가져오기, 테이블 나열, 테이블 데이터에 대한 액세스 제어를 비롯하여 테이블 만들기 및 사용에 관한 자세한 내용은 테이블 만들기 및 사용을 참조하세요.

테이블 속성 업데이트

테이블의 다음 속성을 업데이트할 수 있습니다.

필수 권한

테이블 속성을 업데이트하려면 데이터세트 수준에서 WRITER 액세스 권한이 있거나 bigquery.tables.update 권한을 포함하는 프로젝트 수준의 IAM 역할을 할당받아야 합니다. 다음 사전 정의된 프로젝트 수준 IAM 역할에는 bigquery.tables.update 권한이 포함됩니다.

또한 bigquery.user 역할에는 bigquery.datasets.create 권한이 있기 때문에 bigquery.user 역할에 할당된 사용자는 데이터세트에서 자신이 만든 모든 테이블을 업데이트할 수 있습니다. bigquery.user 역할에 할당된 사용자가 데이터세트를 만들면 이 사용자에게 데이터세트 OWNER 액세스 권한이 부여됩니다. 데이터세트에 대한 OWNER 액세스 권한이 있으면 사용자는 해당 데이터세트와 데이터세트에 포함된 모든 테이블 및 뷰를 완전히 제어할 수 있습니다.

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

테이블의 설명 업데이트

BigQuery 웹 UI, bq update CLI 명령어 또는 tables.patch API 메소드를 사용하여 테이블 설명을 업데이트할 수 있습니다.

테이블 설명을 업데이트하는 방법:

웹 UI

BigQuery 웹 UI를 사용하여 테이블을 만들 때는 설명을 추가할 수 없습니다. 테이블을 만든 후에는 테이블 세부정보 페이지에서 설명을 추가할 수 있습니다.

  1. 탐색 창에서 테이블을 선택합니다.

  2. 테이블 세부정보 페이지에서 Details(세부정보)를 클릭합니다.

  3. 설명 섹션에서 Describe this table(이 테이블 설명하기)을 클릭하여 설명 상자를 엽니다.

  4. 상자에 설명을 입력합니다. 상자 바깥을 클릭하면 텍스트가 저장됩니다.

    테이블 설명

CLI

bq update 명령어를 --description 플래그와 함께 실행합니다. 기본 프로젝트가 아닌 다른 프로젝트의 테이블을 업데이트하려면 프로젝트 ID를 [PROJECT_ID]:[DATASET] 형식으로 데이터세트 이름에 추가합니다.

bq update --description "[DESCRIPTION]" [PROJECT_ID]:[DATASET].[TABLE]

여기에서

  • [DESCRIPTION]은 따옴표로 묶은 테이블 설명 텍스트입니다.
  • [PROJECT_ID]는 프로젝트 ID입니다.
  • [DATASET]는 업데이트할 테이블이 포함되어 있는 데이터세트의 이름입니다.
  • [TABLE]은 업데이트할 테이블의 이름입니다.

예:

mydataset에 있는 mytable의 설명을 'Description of mytable'로 변경하려면 다음 명령어를 입력합니다. mydataset는 기본 프로젝트에 있습니다.

bq update --description "Description of mytable" mydataset.mytable

mydataset에 있는 mytable의 설명을 'Description of mytable'로 변경하려면 다음 명령어를 입력합니다. mydataset는 기본 프로젝트가 아닌 myotherproject에 있습니다.

bq update --description "Description of mytable" myotherproject:mydataset.mytable

API

tables.patch 메소드를 호출하고 description 속성을 사용하여 테이블 리소스의 테이블 설명을 업데이트합니다. tables.update 메소드는 전체 테이블 리소스를 대체하므로 tables.patch 메소드를 사용하는 것이 좋습니다.

Go

이 샘플을 시도하기 전에 클라이언트 라이브러리를 사용하는 BigQuery 빠른 시작의 Go 설정 안내를 따르세요. 자세한 내용은 BigQuery Go API 참조 문서를 확인하세요.

// To run this sample, you will need to create (or reuse) a context and
// an instance of the bigquery client.  For example:
// import "cloud.google.com/go/bigquery"
// ctx := context.Background()
// client, err := bigquery.NewClient(ctx, "your-project-id")
tableRef := client.Dataset(datasetID).Table(tableID)
meta, err := tableRef.Metadata(ctx)
if err != nil {
	return err
}
update := bigquery.TableMetadataToUpdate{
	Description: "Updated description.",
}
if _, err = tableRef.Update(ctx, update, meta.ETag); err != nil {
	return err
}

자바

이 샘플을 시도해 보기 전에 클라이언트 라이브러리를 사용하는 BigQuery 빠른 시작의 자바 설정 안내를 따르세요. 자세한 내용은 BigQuery 자바 API 참조 문서를 확인하세요.

// String datasetName = "my_dataset_name";
// String tableName = "my_table_name";
// String newDescription = "new_description";

Table beforeTable = bigquery.getTable(datasetName, tableName);
TableInfo tableInfo = beforeTable.toBuilder()
    .setDescription(newDescription)
    .build();
Table afterTable = bigquery.update(tableInfo);

Python

이 샘플을 시도해 보기 전에 클라이언트 라이브러리를 사용하는 BigQuery 빠른 시작의 Python 설정 안내를 따르세요. 자세한 내용은 BigQuery Python API 참조 문서를 확인하세요.

Table.description 속성을 구성하고 Client.update_table()을 호출하여 업데이트를 API에 보냅니다.

# from google.cloud import bigquery
# client = bigquery.Client()
# table_ref = client.dataset('my_dataset').table('my_table')
# table = client.get_table(table_ref)  # API request

assert table.description == 'Original description.'
table.description = 'Updated description.'

table = client.update_table(table, ['description'])  # API request

assert table.description == 'Updated description.'

테이블의 만료 시간 업데이트

데이터세트 수준에서 기본 테이블 만료 시간을 설정하거나 테이블을 만들 때 테이블의 만료 시간을 설정할 수 있습니다. 테이블의 만료 시간은 '수명' 또는 TTL이라고도 합니다.

테이블을 만들 때 만료 시간을 설정하면 데이터세트의 기본 테이블 만료 시간은 무시됩니다. 데이터세트 수준에서 기본 테이블 만료 시간을 설정하지 않고 테이블을 만들 때 테이블 만료 시간을 설정하지 않으면, 테이블이 만료되지 않으므로 수동으로 삭제해야 합니다.

테이블을 만든 후에는 언제든지 BigQuery 웹 UI, CLI의 bq update 명령어 또는 API의 tables.patch 메소드를 사용하여 테이블의 만료 시간을 업데이트할 수 있습니다.

테이블의 만료 시간을 업데이트할 때는 테이블 생성 시간을 기준으로 만료 시간을 계산해야 합니다. 예를 들어 테이블을 2018년 1월 3일에 만들었고 오늘이 1월 5일이며, BigQuery 웹 UI를 이용해 만료 시간을 1일로 설정하면 만료 시간은 '이미 지난' 것으로 간주되므로 테이블은 즉시 삭제됩니다.

테이블의 만료 시간을 업데이트하는 방법:

웹 UI

웹 UI를 사용하여 테이블을 만들 때는 설명을 추가할 수 없습니다. 테이블을 만든 후에는 테이블 세부정보 페이지에서 테이블 만료 시간을 추가하거나 업데이트할 수 있습니다.

  1. 탐색 창에서 테이블을 선택합니다.

  2. 테이블 세부정보 페이지에서 Details(세부정보)를 클릭합니다.

  3. 만료 시간에서 수정을 클릭합니다.

  4. 만료 업데이트 대화상자에서 남은 시간을 클릭하고 만료 시간을 일 단위로 입력합니다.

  5. 확인을 클릭합니다. 업데이트된 만료 시간은 세부정보 페이지에 나타납니다.

    테이블 만료

CLI

bq update 명령어를 --expiration 플래그와 함께 실행합니다. 기본 프로젝트가 아닌 다른 프로젝트의 테이블을 업데이트하려면 프로젝트 ID를 [PROJECT_ID]:[DATASET] 형식으로 데이터세트 이름에 추가합니다.

bq update --expiration [INTEGER] [PROJECT_ID]:[DATASET].[TABLE]

여기에서

  • [INTEGER]는 테이블의 기본 수명(단위: 초)입니다. 최소값은 3,600초(1시간)입니다. 만료 시간은 현재 시간과 정수 값을 더한 값으로 계산됩니다.
  • [PROJECT_ID]는 프로젝트 ID입니다.
  • [DATASET]는 업데이트할 테이블이 포함되어 있는 데이터세트의 이름입니다.
  • [TABLE]은 업데이트할 테이블의 이름입니다.

예:

mydataset에 있는 mytable의 만료 시간을 5일(432,000초)로 업데이트하려면 다음 명령어를 입력합니다. mydataset는 기본 프로젝트에 있습니다.

bq update --expiration 432000 mydataset.mytable

mydataset에 있는 mytable의 만료 시간을 5일(432,000초)로 업데이트하려면 다음 명령어를 입력합니다. mydataset는 기본 프로젝트가 아닌 myotherproject에 있습니다.

bq update --expiration 432000 myotherproject:mydataset.mytable

API

tables.patch 메소드를 호출하고 expirationTime 속성을 사용하여 테이블 만료 시간을 밀리초 단위로 업데이트합니다. tables.update 메소드는 전체 테이블 리소스를 대체하므로 tables.patch 메소드를 사용하는 것이 좋습니다.

Go

이 샘플을 시도하기 전에 클라이언트 라이브러리를 사용하는 BigQuery 빠른 시작의 Go 설정 안내를 따르세요. 자세한 내용은 BigQuery Go API 참조 문서를 확인하세요.

// To run this sample, you will need to create (or reuse) a context and
// an instance of the bigquery client.  For example:
// import "cloud.google.com/go/bigquery"
// ctx := context.Background()
// client, err := bigquery.NewClient(ctx, "your-project-id")
tableRef := client.Dataset(datasetID).Table(tableID)
meta, err := tableRef.Metadata(ctx)
if err != nil {
	return err
}
update := bigquery.TableMetadataToUpdate{
	ExpirationTime: time.Now().Add(time.Duration(5*24) * time.Hour), // table expiration in 5 days.
}
if _, err = tableRef.Update(ctx, update, meta.ETag); err != nil {
	return err
}

자바

이 샘플을 시도해 보기 전에 클라이언트 라이브러리를 사용하는 BigQuery 빠른 시작의 자바 설정 안내를 따르세요. 자세한 내용은 BigQuery 자바 API 참조 문서를 확인하세요.

Table beforeTable = bigquery.getTable(datasetName, tableName);

// Set table to expire 5 days from now.
long expirationMillis = DateTime.now().plusDays(5).getMillis();
TableInfo tableInfo = beforeTable.toBuilder()
        .setExpirationTime(expirationMillis)
        .build();
Table afterTable = bigquery.update(tableInfo);

Python

이 샘플을 시도해 보기 전에 클라이언트 라이브러리를 사용하는 BigQuery 빠른 시작의 Python 설정 안내를 따르세요. 자세한 내용은 BigQuery Python API 참조 문서를 확인하세요.

Table.expires 속성을 구성하고 Client.update_table()을 호출하여 업데이트를 API로 보냅니다.

import datetime
import pytz

# from google.cloud import bigquery
# client = bigquery.Client()
# table_ref = client.dataset('my_dataset').table('my_table')
# table = client.get_table(table_ref)  # API request

assert table.expires is None

# set table to expire 5 days from now
expiration = datetime.datetime.now(pytz.utc) + datetime.timedelta(days=5)
table.expires = expiration
table = client.update_table(table, ['expires'])  # API request

# expiration is stored in milliseconds
margin = datetime.timedelta(microseconds=1000)
assert expiration - margin <= table.expires <= expiration + margin

테이블의 스키마 정의 업데이트

테이블의 스키마 정의를 업데이트하는 방법은 테이블 스키마 수정을 참조하세요

테이블 이름 바꾸기

현재는 기존 테이블의 이름을 변경할 수 없습니다. 테이블 이름을 변경해야 한다면 테이블 복사 단계를 따라야 합니다. 복사 작업에서 대상 테이블을 지정할 때는 새 테이블 이름을 사용해야 합니다.

테이블 복사

BigQuery 웹 UI 또는 명령줄 도구의 bq cp 명령어를 사용하거나, jobs.insert API 메소드를 호출하고 복사 작업을 구성하여 테이블을 복사할 수 있습니다.

필수 권한

데이터세트 수준에서 테이블을 복사하려면 복사할 테이블이 포함된 소스 데이터세트에 대한 READER 액세스 권한과 대상 데이터세트에 대한 WRITER 액세스 권한이 필요합니다.

데이터세트 수준의 권한을 사용하는 대신 bigquery.tables.createbigquery.tables.getData 권한을 포함하는 프로젝트 수준 IAM 역할을 활용할 수도 있습니다. 대상 데이터세트에서 테이블 복사본을 만드는 데 bigquery.tables.create 권한이 필요합니다. bigquery.tables.getData 권한은 복사하는 테이블의 데이터를 읽는 데 필요합니다.

아래의 사전 정의된 프로젝트 수준 IAM 역할에는 프로젝트의 모든 데이터세트에 대한 bigquery.tables.createbigquery.tables.getData 권한이 있습니다.

또한 bigquery.user 역할에는 bigquery.datasets.create 권한이 있기 때문에 bigquery.user 역할에 할당된 사용자는 자신이 만든 모든 테이블의 데이터를 읽고 자신이 만든 모든 데이터세트의 테이블 복사본을 만들 수 있습니다. bigquery.user 역할이 할당된 사용자가 데이터세트를 만들면 해당 사용자에게 데이터세트에 대한 OWNER 액세스 권한이 부여됩니다. 데이터세트에 대한 OWNER 액세스 권한이 있으면 사용자는 해당 데이터세트와 데이터세트에 포함된 모든 테이블을 완벽하게 제어할 수 있습니다.

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

테이블 복사 제한사항

테이블 복사 작업에는 다음과 같은 제한사항이 적용됩니다.

  • 테이블을 복사할 때 대상 테이블의 이름은 테이블을 만들 때와 동일한 명명 규칙을 따라야 합니다.
  • 테이블 복사본에는 복사 작업에 대한 BigQuery의 할당량 정책이 적용됩니다.
  • BigQuery 웹 UI를 사용하여 테이블을 복사할 때는 대상 데이터세트의 기존 테이블을 덮어쓸 수 없습니다. 테이블의 이름은 대상 데이터세트 내에서 고유해야 합니다.
  • 테이블을 복사할 때 대상 데이터세트는 복사할 테이블이 포함되는 데이터세트와 같은 위치에 있어야 합니다. 예를 들어 EU 기반 데이터세트의 테이블을 복사해 US 기반 데이터세트에 쓸 수는 없습니다.
  • 웹 UI는 여러 소스 테이블을 단일 대상 테이블에 복사하는 작업은 지원하지 않습니다.
  • CLI나 API를 이용해 여러 원본 테이블을 단일 대상 테이블로 복사할 때는 모든 원본 테이블의 스키마가 같아야 합니다.

단일 소스 테이블 복사

BigQuery 웹 UI 또는 명령줄 도구의 bq cp 명령어를 사용하거나, jobs.insert API 메소드를 호출하고 복사 작업을 구성한 다음 configuration.copy.sourceTable 속성을 지정하여 단일 테이블을 복사할 수 있습니다.

BigQuery 웹 UI는 소스 테이블 하나와 대상 테이블 하나만 지원합니다. 대상 테이블에 여러 소스 파일을 복사하려면 명령줄 도구나 API를 사용해야 합니다.

단일 원본 테이블을 복사하는 방법:

웹 UI

  1. 복사할 테이블 옆에 있는 메뉴 표시 아이콘 아래쪽 화살표을 클릭하고 테이블 복사를 클릭합니다.

  2. 테이블 복사 대화상자에서:

    • Destination project(대상 프로젝트)에서 복사한 테이블을 저장할 프로젝트를 선택합니다.
    • Destination dataset(대상 데이터세트)에서 복사한 테이블을 저장할 데이터세트를 선택합니다. 소스 데이터세트와 대상 데이터세트는 동일한 위치에 있어야 합니다.
    • 대상 테이블에 새 테이블의 이름을 입력합니다. 이름은 대상 데이터세트 내에서 고유해야 합니다. 테이블 이름은 최대 1,024자까지 허용되며, a-z, A-Z, 0-9 또는 _(밑줄 문자)만 포함할 수 있습니다. BigQuery 웹 UI를 사용하여 대상 데이터세트의 기존 테이블을 덮어쓸 수는 없습니다.

      테이블 복사

  3. 확인을 클릭하여 복사 작업을 시작합니다.

명령줄

bq cp 명령어를 실행합니다. 선택적 플래그를 사용하면 대상 테이블의 쓰기 처리를 제어할 수 있습니다.

  • -a 또는 --append_table은 소스 테이블의 데이터를 대상 데이터세트의 기존 테이블에 추가합니다.
  • -f 또는 --force는 대상 데이터세트의 기존 테이블을 덮어쓰며 확인 메시지를 표시하지 않습니다.
  • -n 또는 --no_clobber는 테이블이 대상 데이터세트에 있으면 다음과 같은 오류 메시지를 반환합니다. Table '[PROJECT_ID]:[DATASET].[TABLE]' already exists, skipping. -n을 지정하지 않으면 기본 동작으로 대상 테이블을 교체할지 묻는 메시지를 표시합니다.
  • --destination_kms_key는 대상 테이블을 암호화하는 데 사용하는 고객 관리 Cloud KMS 키입니다.

--destination_kms_key는 여기서 설명하지 않습니다. 자세한 내용은 Cloud KMS 키로 데이터 보호를 참조하세요.

소스 또는 대상 데이터세트가 기본 프로젝트가 아닌 다른 프로젝트에 있다면 프로젝트 ID를 [PROJECT_ID]:[DATASET] 형식으로 데이터세트 이름에 추가합니다.

--location 플래그를 입력하고 값을 사용자 위치로 설정합니다.

bq --location=[LOCATION] cp -a -f -n [PROJECT_ID]:[DATASET].[SOURCE_TABLE] [PROJECT_ID]:[DATASET].[DESTINATION_TABLE]

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

  • [LOCATION]은 사용자 위치의 이름입니다. --location 플래그는 선택사항입니다. 예를 들어 도쿄 지역에서 BigQuery를 사용하는 경우 플래그 값을 asia-northeast1로 설정할 수 있습니다. .bigqueryrc 파일을 사용하여 위치 기본값을 설정할 수 있습니다.
  • [PROJECT_ID]는 프로젝트 ID입니다.
  • [DATASET]는 소스 또는 대상 데이터세트의 이름입니다.
  • [SOURCE_TABLE]은 복사할 테이블입니다.
  • [DESTINATION_TABLE]은 대상 데이터세트의 테이블 이름입니다.

예:

mydataset.mytablemydataset2.mytable2로 복사하려면 다음 명령어를 입력합니다. 두 데이터세트 모두 기본 프로젝트에 있으며 US 다중 지역 위치에서 생성되었습니다.

bq --location=US cp mydataset.mytable mydataset2.mytable2

mydataset.mytable을 복사하고 이름이 같은 대상 테이블을 덮어쓰려면 다음 명령어를 입력합니다. 소스 데이터세트는 기본 프로젝트에 있고, 대상 데이터세트는 myotherproject에 있습니다. -f 단축키는 대상 테이블을 확인 메시지 없이 덮어쓰는 데 사용합니다. mydatasetmyotherdatasetUS 다중 지역 위치에서 생성되었습니다.

bq --location=US cp -f mydataset.mytable myotherproject:myotherdataset.mytable

다음 명령어를 입력하면 mydataset.mytable을 복사하고 대상 데이터세트에 이름이 같은 테이블이 있다면 오류가 반환됩니다. 소스 데이터세트는 기본 프로젝트에 있고, 대상 데이터세트는 myotherproject에 있습니다. -n 단축키는 이름이 같은 테이블을 덮어쓰지 못하게 하는 데 사용합니다. 두 데이터세트 모두 US 다중 지역 위치에서 생성되었습니다.

bq --location=US cp -n mydataset.mytable myotherproject:myotherdataset.mytable

mydataset.mytable을 복사하고 이름이 같은 대상 테이블에 데이터를 추가하려면 다음 명령어를 입력합니다. 소스 데이터세트는 기본 프로젝트에 있고, 대상 데이터세트는 myotherproject에 있습니다. -a 단축키는 대상 테이블에 추가하는 데 사용합니다. 두 데이터세트 모두 US 다중 지역 위치에서 생성되었습니다.

bq --location=US cp -a mydataset.mytable myotherproject:myotherdataset.mytable

mydataset.mytablemydataset2.mytable2로 복사하려면 다음 명령어를 입력합니다. 두 데이터세트 모두 기본 프로젝트에 있습니다. 두 데이터세트 모두 asia-northeast1 지역에서 생성되었습니다.

bq --location=asia-northeast1 cp mydataset.mytable mydataset2.mytable2

API

API를 사용하여 테이블을 복사하는 방법은 다음과 같습니다.

bigquery.jobs.insert 메소드를 호출하고 copy 작업을 구성하면 API를 사용하여 기존 테이블을 복사할 수 있습니다. 작업 리소스jobReference 섹션에 있는 location 속성에 위치를 지정합니다.

작업 구성에 다음 값을 지정해야 합니다.

"copy": {
      "sourceTable": {       // Required
        "projectId": string, // Required
        "datasetId": string, // Required
        "tableId": string    // Required
      },
      "destinationTable": {  // Required
        "projectId": string, // Required
        "datasetId": string, // Required
        "tableId": string    // Required
      },
      "createDisposition": string,  // Optional
      "writeDisposition": string,   // Optional
    },

여기서 sourceTable은 복사할 테이블에 대한 정보를 제공하고 destinationTable은 새 테이블에 대한 정보를 제공하며, createDisposition은 테이블이 없을 때 테이블을 만들지 여부를 지정하고 writeDisposition은 기존 테이블에 데이터를 덮어쓸지 또는 추가할지를 지정합니다.

C#

이 샘플을 시도해 보기 전에 클라이언트 라이브러리를 사용하는 BigQuery 빠른 시작의 C# 설정 안내를 따르세요. 자세한 내용은 BigQuery C# API 참조 문서를 참조하세요.

using Google.Apis.Bigquery.v2.Data;
using Google.Cloud.BigQuery.V2;
using System;

public class BigQueryCopyTable
{
    public void CopyTable(
        string projectId = "your-project-id",
        string destinationDatasetId = "your_dataset_id"
    )
    {
        BigQueryClient client = BigQueryClient.Create(projectId);
        TableReference sourceTableRef = new TableReference()
        {
            TableId = "shakespeare",
            DatasetId = "samples",
            ProjectId = "bigquery-public-data"
        };
        TableReference destinationTableRef = client.GetTableReference(
            destinationDatasetId, "destination_table");
        BigQueryJob job = client.CreateCopyJob(
            sourceTableRef, destinationTableRef)
            .PollUntilCompleted();  // Wait for the job to complete.
        // Retrieve destination table
        BigQueryTable destinationTable = client.GetTable(destinationTableRef);
        Console.WriteLine(
            $"Copied {destinationTable.Resource.NumRows} rows from table "
            + $"{sourceTableRef.DatasetId}.{sourceTableRef.TableId} "
            + $"to {destinationTable.FullyQualifiedId}."
        );
    }
}

Go

이 샘플을 시도하기 전에 클라이언트 라이브러리를 사용하는 BigQuery 빠른 시작의 Go 설정 안내를 따르세요. 자세한 내용은 BigQuery Go API 참조 문서를 확인하세요.

// To run this sample, you will need to create (or reuse) a context and
// an instance of the bigquery client.  For example:
// import "cloud.google.com/go/bigquery"
// ctx := context.Background()
// client, err := bigquery.NewClient(ctx, "your-project-id")
dataset := client.Dataset(datasetID)
copier := dataset.Table(dstID).CopierFrom(dataset.Table(srcID))
copier.WriteDisposition = bigquery.WriteTruncate
job, err := copier.Run(ctx)
if err != nil {
	return err
}
status, err := job.Wait(ctx)
if err != nil {
	return err
}
if err := status.Err(); err != nil {
	return err
}

자바

이 샘플을 시도해 보기 전에 클라이언트 라이브러리를 사용하는 BigQuery 빠른 시작의 자바 설정 안내를 따르세요. 자세한 내용은 BigQuery 자바 API 참조 문서를 확인하세요.

TableId destinationId = TableId.of(dataset, tableName);
JobOption options = JobOption.fields(JobField.STATUS, JobField.USER_EMAIL);
Job job = table.copy(destinationId, options);
// Wait for the job to complete.
try {
  Job completedJob =
      job.waitFor(
          RetryOption.initialRetryDelay(Duration.ofSeconds(1)),
          RetryOption.totalTimeout(Duration.ofMinutes(3)));
  if (completedJob != null && completedJob.getStatus().getError() == null) {
    // Job completed successfully.
  } else {
    // Handle error case.
  }
} catch (InterruptedException e) {
  // Handle interrupted wait
}

Node.js

이 샘플을 시도해 보기 전에 클라이언트 라이브러리를 사용하는 BigQuery 빠른 시작의 Node.js 설정 안내를 따르세요. 자세한 내용은 BigQuery Node.js API 참조 문서를 확인하세요.

// Imports the Google Cloud client library
const {BigQuery} = require('@google-cloud/bigquery');

/**
 * TODO(developer): Uncomment the following lines before running the sample.
 */
// const projectId = "your-project-id";
// const srcDatasetId = "my_src_dataset";
// const srcTableId = "my_src_table";
// const destDatasetId = "my_dest_dataset";
// const destTableId = "my_dest_table";

// Creates a client
const bigquery = new BigQuery({projectId});

// Copies the table contents into another table
const [job] = await bigquery
  .dataset(srcDatasetId)
  .table(srcTableId)
  .copy(bigquery.dataset(destDatasetId).table(destTableId));

console.log(`Job ${job.id} completed.`);

// Check the job's status for errors
const errors = job.status.errors;
if (errors && errors.length > 0) {
  throw errors;
}

PHP

이 샘플을 시도해 보기 전에 클라이언트 라이브러리를 사용하는 BigQuery 빠른 시작의 PHP 설정 안내를 따르세요. 자세한 내용은 BigQuery PHP API 참조 문서를 참조하세요.

use Google\Cloud\BigQuery\BigQueryClient;
use Google\Cloud\Core\ExponentialBackoff;

/** Uncomment and populate these variables in your code */
// $projectId = 'The Google project ID';
// $datasetId = 'The BigQuery dataset ID';
// $sourceTableId   = 'The BigQuery table ID to copy from';
// $destinationTableId = 'The BigQuery table ID to copy to';

$bigQuery = new BigQueryClient([
    'projectId' => $projectId,
]);
$dataset = $bigQuery->dataset($datasetId);
$sourceTable = $dataset->table($sourceTableId);
$destinationTable = $dataset->table($destinationTableId);
$copyConfig = $sourceTable->copy($destinationTable);
$job = $sourceTable->runJob($copyConfig);

// poll the job until it is complete
$backoff = new ExponentialBackoff(10);
$backoff->execute(function () use ($job) {
    print('Waiting for job to complete' . PHP_EOL);
    $job->reload();
    if (!$job->isComplete()) {
        throw new Exception('Job has not yet completed', 500);
    }
});
// check if the job has errors
if (isset($job->info()['status']['errorResult'])) {
    $error = $job->info()['status']['errorResult']['message'];
    printf('Error running job: %s' . PHP_EOL, $error);
} else {
    print('Table copied successfully' . PHP_EOL);
}

Python

이 샘플을 시도해 보기 전에 클라이언트 라이브러리를 사용하는 BigQuery 빠른 시작의 Python 설정 안내를 따르세요. 자세한 내용은 BigQuery Python API 참조 문서를 확인하세요.

# from google.cloud import bigquery
# client = bigquery.Client()

source_dataset = client.dataset('samples', project='bigquery-public-data')
source_table_ref = source_dataset.table('shakespeare')

# dataset_id = 'my_dataset'
dest_table_ref = client.dataset(dataset_id).table('destination_table')

job = client.copy_table(
    source_table_ref,
    dest_table_ref,
    # Location must match that of the source and destination tables.
    location='US')  # API request

job.result()  # Waits for job to complete.

assert job.state == 'DONE'
dest_table = client.get_table(dest_table_ref)  # API request
assert dest_table.num_rows > 0

여러 소스 테이블 복사

명령줄 도구의 bq cp 명령어를 사용하거나, jobs.insert 메소드를 호출하고 복사 작업을 구성한 다음 configuration.copy.sourceTables 속성을 지정하여 여러 소스 테이블을 대상 테이블에 복사할 수 있습니다. 모든 소스 테이블은 스키마가 같아야 하며 대상 테이블은 하나만 허용됩니다.

소스 테이블은 쉼표로 구분된 목록으로 지정해야 합니다. 여러 소스 테이블을 복사할 때는 와일드 카드를 사용할 수 없습니다.

여러 소스 테이블을 복사하는 방법은 다음과 같습니다.

명령줄

bq cp 명령어를 실행하고 여러 소스 테이블을 쉼표로 구분된 목록으로 포함합니다. 선택적 플래그를 사용하면 대상 테이블의 쓰기 처리를 제어할 수 있습니다.

  • -a 또는 --append_table은 소스 테이블의 데이터를 대상 데이터세트의 기존 테이블에 추가합니다.
  • -f 또는 --force는 대상 데이터세트의 기존 대상 테이블을 덮어쓰며 확인 메시지를 표시하지 않습니다.
  • -n 또는 --no_clobber는 테이블이 대상 데이터세트에 있으면 다음과 같은 오류 메시지를 반환합니다. Table '[PROJECT_ID]:[DATASET].[TABLE]' already exists, skipping. -n을 지정하지 않으면 기본 동작으로 대상 테이블을 교체할지 묻는 메시지를 표시합니다.
  • --destination_kms_key는 대상 테이블을 암호화하는 데 사용하는 고객 관리 Cloud KMS 키입니다.

--destination_kms_key는 여기서 설명하지 않습니다. 자세한 내용은 Cloud KMS 키로 데이터 보호를 참조하세요.

소스 또는 대상 데이터세트가 기본 프로젝트가 아닌 다른 프로젝트에 있다면 프로젝트 ID를 [PROJECT_ID]:[DATASET] 형식으로 데이터세트 이름에 추가합니다.

--location 플래그를 입력하고 값을 사용자 위치로 설정합니다.

bq --location=[LOCATION] cp -a -f -n [PROJECT_ID]:[DATASET].[SOURCE_TABLE],[PROJECT_ID]:[DATASET].[SOURCE_TABLE] [PROJECT_ID]:[DATASET].[DESTINATION_TABLE]

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

  • [LOCATION]은 사용자 위치의 이름입니다. --location 플래그는 선택사항입니다. 예를 들어 도쿄 지역에서 BigQuery를 사용하는 경우 플래그 값을 asia-northeast1로 설정할 수 있습니다. .bigqueryrc 파일을 사용하여 위치 기본값을 설정할 수 있습니다.
  • [PROJECT_ID]는 프로젝트 ID입니다.
  • [DATASET]는 소스 또는 대상 데이터세트의 이름입니다.
  • [SOURCE_TABLE]은 복사할 테이블입니다.
  • [DESTINATION_TABLE]은 대상 데이터세트의 테이블 이름입니다.

예:

mydataset.mytablemydataset.mytable2mydataset2.tablecopy로 복사하려면 다음 명령어를 입력합니다. 모든 데이터세트는 기본 프로젝트에 있으며 US 다중 지역 위치에서 생성되었습니다.

bq --location=US cp mydataset.mytable,mydataset.mytable2 mydataset2.tablecopy

mydataset.mytablemydataset.mytable2myotherdataset.mytable로 복사하고 이름이 같은 대상 테이블을 덮어쓰려면 다음 명령어를 입력합니다. 대상 데이터세트는 기본 프로젝트가 아닌 myotherproject에 있습니다. -f 단축키는 대상 테이블을 확인 메시지 없이 덮어쓰는 데 사용합니다. 두 데이터세트 모두 US 다중 지역 위치에서 생성되었습니다.

bq --location=US cp -f mydataset.mytable,mydataset.mytable2 myotherproject:myotherdataset.mytable

다음 명령어를 입력하면 myproject:mydataset.mytablemyproject:mydataset.mytable2를 복사하고 대상 데이터세트에 이름이 같은 테이블이 있다면 오류가 반환됩니다. 대상 데이터세트는 myotherproject에 있습니다. -n 단축키는 이름이 같은 테이블을 덮어쓰지 못하게 하는 데 사용합니다. 모든 데이터세트는 US 다중 지역 위치에서 생성되었습니다.

bq --location=US cp -n myproject:mydataset.mytable,myproject:mydataset.mytable2 myotherproject:myotherdataset.mytable

mydataset.mytablemydataset.mytable2를 복사하고 데이터를 이름이 같은 대상 테이블에 추가하려면 다음 명령어를 입력합니다. 소스 데이터세트는 기본 프로젝트에 있고, 대상 데이터세트는 myotherproject에 있습니다. -a 단축키는 대상 테이블에 추가하는 데 사용합니다. 모든 데이터세트는 US 다중 지역 위치에서 생성되었습니다.

bq --location=US cp -a mydataset.mytable,mydataset.mytable2 myotherproject:myotherdataset.mytable

mydataset.mytablemydataset.mytable2mydataset2.tablecopy로 복사하려면 다음 명령어를 입력합니다. 모든 데이터세트는 기본 프로젝트에 있으며 asia-northeast1 지역에서 생성되었습니다.

bq --location=asia-northeast1 cp mydataset.mytable,mydataset.mytable2 mydataset2.tablecopy

API

API로 여러 테이블을 복사하려면 jobs.insert 메소드를 호출하고 복사 작업을 구성한 다음 configuration.copy.sourceTables 속성을 지정합니다.

작업 리소스jobReference 섹션에서 location 속성에 지역을 지정합니다.

Go

이 샘플을 시도하기 전에 클라이언트 라이브러리를 사용하는 BigQuery 빠른 시작의 Go 설정 안내를 따르세요. 자세한 내용은 BigQuery Go API 참조 문서를 확인하세요.

// To run this sample, you will need to create (or reuse) a context and
// an instance of the bigquery client.  For example:
// import "cloud.google.com/go/bigquery"
// ctx := context.Background()
// client, err := bigquery.NewClient(ctx, "your-project-id")
dataset := client.Dataset(datasetID)

srcTableIDs := []string{"table1", "table2"}
var tableRefs []*bigquery.Table
for _, v := range srcTableIDs {
	tableRefs = append(tableRefs, dataset.Table(v))
}
copier := dataset.Table(dstTableID).CopierFrom(tableRefs...)
copier.WriteDisposition = bigquery.WriteTruncate
job, err := copier.Run(ctx)
if err != nil {
	return err
}
status, err := job.Wait(ctx)
if err != nil {
	return err
}
if err := status.Err(); err != nil {
	return err
}

자바

이 샘플을 시도해 보기 전에 클라이언트 라이브러리를 사용하는 BigQuery 빠른 시작의 자바 설정 안내를 따르세요. 자세한 내용은 BigQuery 자바 API 참조 문서를 확인하세요.

TableId destinationTable = TableId.of(datasetId, destinationTableId);
CopyJobConfiguration configuration =
    CopyJobConfiguration.newBuilder(
        destinationTable,
        Arrays.asList(
            TableId.of(datasetId, "table1"),
            TableId.of(datasetId, "table2")))
    .build();

// Copy the tables.
Job job = bigquery.create(JobInfo.of(configuration));
job = job.waitFor();

// Check the table
StandardTableDefinition table = bigquery.getTable(destinationTable).getDefinition();
System.out.println("State: " + job.getStatus().getState());
System.out.printf("Copied %d rows.\n", table.getNumRows());

Python

이 샘플을 시도해 보기 전에 클라이언트 라이브러리를 사용하는 BigQuery 빠른 시작의 Python 설정 안내를 따르세요. 자세한 내용은 BigQuery Python API 참조 문서를 확인하세요.

# from google.cloud import bigquery
# client = bigquery.Client()
# source_dataset_id = 'my_source_dataset'
# dest_dataset_id = 'my_destination_dataset'

table1_ref = client.dataset(source_dataset_id).table('table1')
table2_ref = client.dataset(source_dataset_id).table('table2')
dest_table_ref = client.dataset(dest_dataset_id).table('destination_table')

job = client.copy_table(
    [table1_ref, table2_ref],
    dest_table_ref,
    # Location must match that of the source and destination tables.
    location='US')  # API request
job.result()  # Waits for job to complete.

assert job.state == 'DONE'
dest_table = client.get_table(dest_table_ref)  # API request
assert dest_table.num_rows > 0

테이블 삭제

BigQuery 웹 UI 또는 명령줄 도구의 bq rm 명령어를 사용하거나 tables.delete API 메소드를 호출하여 테이블을 삭제할 수 있습니다. 현재는 한 번에 하나의 테이블만 삭제할 수 있습니다.

테이블을 삭제하면 테이블의 데이터도 모두 삭제됩니다. 지정된 시간이 경과한 후 자동으로 테이블을 삭제하려면 데이터세트의 기본 테이블 만료 시간을 설정하거나 테이블을 만들 때 만료 시간을 설정합니다.

필수 권한

테이블을 삭제하려면 데이터세트 수준에서 OWNER 액세스 권한이 있거나 bigquery.tables.delete 권한을 포함하는 프로젝트 수준 IAM 역할을 할당받아야 합니다. 아래의 사전 정의된 프로젝트 수준 IAM 역할에는 bigquery.tables.delete 권한이 있습니다.

사전 정의된 프로젝트 수준 역할이 할당된 사용자는 프로젝트의 모든 데이터세트에서 테이블을 삭제할 수 있습니다. 데이터세트 수준의 OWNER 권한이 할당된 사용자는 해당 데이터세트의 테이블만 삭제할 수 있습니다.

또한 bigquery.user 역할에는 bigquery.datasets.create 권한이 있기 때문에 bigquery.user 역할에 할당된 사용자는 자신이 만든 모든 데이터세트에서 테이블을 삭제할 수 있습니다. bigquery.user 역할에 할당된 사용자가 데이터세트를 만들면 이 사용자에게 데이터세트 OWNER 액세스 권한이 부여됩니다. 데이터세트에 대한 OWNER 액세스 권한이 있는 사용자는 해당 데이터세트와 데이터세트에 포함된 모든 테이블을 완벽하게 제어할 수 있습니다.

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

테이블 삭제

테이블을 삭제하는 방법:

웹 UI

  1. 탐색 메뉴의 테이블 이름 옆에 있는 아래쪽 화살표 아이콘 아래쪽 화살표 아이콘을 클릭하고 테이블 삭제를 클릭합니다.

  2. 메시지가 나타나면 확인을 클릭합니다.

명령줄

bq rm 명령어를 --table 플래그(또는 -t 단축키)와 함께 사용하여 테이블을 삭제합니다. CLI로 테이블을 삭제할 때는 작업을 확인해야 합니다. --force 플래그(또는 -f 단축키)를 사용하면 확인을 건너뛸 수 있습니다.

테이블이 기본 프로젝트가 아닌 다른 프로젝트의 데이터세트에 있다면 프로젝트 ID를 [PROJECT_ID]:[DATASET] 형식으로 데이터세트 이름에 추가합니다.

bq rm -f -t [PROJECT_ID]:[DATASET].[TABLE]

여기에서

  • [PROJECT_ID]는 프로젝트 ID입니다.
  • [DATASET]는 테이블이 포함된 데이터세트의 이름입니다.
  • [TABLE]은 삭제할 테이블의 이름입니다.

예:

mytablemydataset에서 삭제하려면 다음 명령어를 입력합니다. mydataset는 기본 프로젝트에 있습니다.

bq rm -t mydataset.mytable

mytablemydataset에서 삭제하려면 다음 명령어를 입력합니다. mydataset는 기본 프로젝트가 아닌 myotherproject에 있습니다.

bq rm -t myotherproject:mydataset.mytable

mytablemydataset에서 삭제하려면 다음 명령어를 입력합니다. mydataset는 기본 프로젝트에 있습니다. 이 명령어는 단축형 -f를 사용하여 확인을 건너뜁니다.

bq rm -f -t mydataset.mytable

API

tables.delete API 메소드를 호출하고 tableId 매개변수를 사용하여 삭제할 테이블을 지정합니다.

C#

이 샘플을 시도해 보기 전에 클라이언트 라이브러리를 사용하는 BigQuery 빠른 시작의 C# 설정 안내를 따르세요. 자세한 내용은 BigQuery C# API 참조 문서를 참조하세요.

using Google.Cloud.BigQuery.V2;
using System;

public class BigQueryDeleteTable
{
    public void DeleteTable(
        string projectId = "your-project-id",
        string datasetId = "your_dataset_id",
        string tableId = "your_table_id"
    )
    {
        BigQueryClient client = BigQueryClient.Create(projectId);
        client.DeleteTable(datasetId, tableId);
        Console.WriteLine($"Table {tableId} deleted.");
    }
}

Go

이 샘플을 시도하기 전에 클라이언트 라이브러리를 사용하는 BigQuery 빠른 시작의 Go 설정 안내를 따르세요. 자세한 내용은 BigQuery Go API 참조 문서를 확인하세요.

// To run this sample, you will need to create (or reuse) a context and
// an instance of the bigquery client.  For example:
// import "cloud.google.com/go/bigquery"
// ctx := context.Background()
// client, err := bigquery.NewClient(ctx, "your-project-id")
table := client.Dataset(datasetID).Table(tableID)
if err := table.Delete(ctx); err != nil {
	return err
}

자바

이 샘플을 시도해 보기 전에 클라이언트 라이브러리를 사용하는 BigQuery 빠른 시작의 자바 설정 안내를 따르세요. 자세한 내용은 BigQuery 자바 API 참조 문서를 확인하세요.

TableId tableId = TableId.of(projectId, datasetName, tableName);
boolean deleted = bigquery.delete(tableId);
if (deleted) {
  // the table was deleted
} else {
  // the table was not found
}

Node.js

이 샘플을 시도해 보기 전에 클라이언트 라이브러리를 사용하는 BigQuery 빠른 시작의 Node.js 설정 안내를 따르세요. 자세한 내용은 BigQuery Node.js API 참조 문서를 확인하세요.

// Imports the Google Cloud client library
const {BigQuery} = require('@google-cloud/bigquery');

/**
 * TODO(developer): Uncomment the following lines before running the sample.
 */
// const projectId = "your-project-id";
// const datasetId = "my_dataset";
// const tableId = "my_table";

// Creates a client
const bigquery = new BigQuery({projectId});

// Deletes the table
await bigquery
  .dataset(datasetId)
  .table(tableId)
  .delete();

console.log(`Table ${tableId} deleted.`);

PHP

이 샘플을 시도해 보기 전에 클라이언트 라이브러리를 사용하는 BigQuery 빠른 시작의 PHP 설정 안내를 따르세요. 자세한 내용은 BigQuery PHP API 참조 문서를 참조하세요.

use Google\Cloud\BigQuery\BigQueryClient;

/** Uncomment and populate these variables in your code */
// $projectId = 'The Google project ID';
// $datasetId = 'The BigQuery dataset ID';
// $tableId = 'The BigQuery table ID';

$bigQuery = new BigQueryClient([
    'projectId' => $projectId,
]);
$dataset = $bigQuery->dataset($datasetId);
$table = $dataset->table($tableId);
$table->delete();
printf('Deleted table %s.%s' . PHP_EOL, $datasetId, $tableId);

Python

이 샘플을 시도해 보기 전에 클라이언트 라이브러리를 사용하는 BigQuery 빠른 시작의 Python 설정 안내를 따르세요. 자세한 내용은 BigQuery Python API 참조 문서를 확인하세요.

# from google.cloud import bigquery
# client = bigquery.Client()
# dataset_id = 'my_dataset'
# table_id = 'my_table'

table_ref = client.dataset(dataset_id).table(table_id)
client.delete_table(table_ref)  # API request

print('Table {}:{} deleted.'.format(dataset_id, table_id))

Ruby

이 샘플을 시도해 보기 전에 클라이언트 라이브러리를 사용하는 BigQuery 빠른 시작의 Ruby 설정 안내를 따르세요. 자세한 내용은 BigQuery Ruby API 참조 문서를 참조하세요.

require "google/cloud/bigquery"

def delete_table dataset_id = "my_dataset_id", table_id = "my_table_id"
  bigquery = Google::Cloud::Bigquery.new
  dataset  = bigquery.dataset dataset_id
  table    = dataset.table table_id

  table.delete

  puts "Table #{table_id} deleted."
end

삭제된 테이블 복원

테이블은 삭제 후 2일 이내에 복원할 수 있습니다. 스냅샷 데코레이터 기능을 활용하면 삭제 이벤트 이전에 테이블을 참조한 다음 복사할 수 있습니다. 하지만 이 방법으로 참조를 만들 때는 두 가지 중요한 주의사항이 있습니다.

  • 삭제 시간 이후에 데이터세트에서 ID가 같은 테이블을 만들면 삭제한 테이블을 참조할 수 없습니다.

  • 캡슐화 데이터세트가 테이블 삭제 이벤트 이후에 삭제되거나 다시 생성되었다면 삭제한 테이블을 참조할 수 없습니다.

CLI

이전 SQL로 테이블을 삭제 취소하려면 @<time> 스냅샷 데코레이터를 사용합니다. 먼저 테이블이 존재했던 시점의 UNIX 타임스탬프(밀리초)를 확인합니다. 그런 다음 해당 타임스탬프에 있는 테이블을 새 테이블에 복사합니다. 새 테이블의 이름은 삭제한 테이블의 이름과 달라야 합니다.

예를 들어 다음 명령어를 입력하면 1418864998000 시점의 mydataset.mytable을 새 테이블인 mydataset.newtable로 복사합니다.

--location 플래그를 입력하고 값을 사용자 위치로 설정합니다.

bq --location=[LOCATION] cp mydataset.mytable@1418864998000 mydataset.newtable

자세한 내용은 이전 SQL의 테이블 데코레이터를 참조하세요.

Go

// To run this sample, you will need to create (or reuse) a context and
// an instance of the bigquery client.  For example:
// import "cloud.google.com/go/bigquery"
// ctx := context.Background()
// client, err := bigquery.NewClient(ctx, "your-project-id")

ds := client.Dataset(datasetID)
if _, err := ds.Table(tableID).Metadata(ctx); err != nil {
	return err
}
// Record the current time.  We'll use this as the snapshot time
// for recovering the table.
snapTime := time.Now()

// "Accidentally" delete the table.
if err := client.Dataset(datasetID).Table(tableID).Delete(ctx); err != nil {
	return err
}

// Construct the restore-from tableID using a snapshot decorator.
snapshotTableID := fmt.Sprintf("%s@%d", tableID, snapTime.UnixNano()/1e6)
// Choose a new table ID for the recovered table data.
recoverTableID := fmt.Sprintf("%s_recovered", tableID)

// Construct and run a copy job.
copier := ds.Table(recoverTableID).CopierFrom(ds.Table(snapshotTableID))
copier.WriteDisposition = bigquery.WriteTruncate
job, err := copier.Run(ctx)
if err != nil {
	return err
}
status, err := job.Wait(ctx)
if err != nil {
	return err
}
if err := status.Err(); err != nil {
	return err
}

자바

이 샘플을 시도해 보기 전에 클라이언트 라이브러리를 사용하는 BigQuery 빠른 시작의 자바 설정 안내를 따르세요. 자세한 내용은 BigQuery 자바 API 참조 문서를 확인하세요.

// String datasetId = "my_dataset";
String tableId = "oops_undelete_me";

// Record the current time.  We'll use this as the snapshot time
// for recovering the table.
long snapTime = Instant.now().getMillis();

// "Accidentally" delete the table.
bigquery.delete(TableId.of(datasetId, tableId));

// Construct the restore-from tableID using a snapshot decorator.
String snapshotTableId = String.format("%s@%d", tableId, snapTime);
// Choose a new table ID for the recovered table data.
String recoverTableId = String.format("%s_recovered", tableId);

// Construct and run a copy job.
CopyJobConfiguration configuration =
    CopyJobConfiguration.newBuilder(
        TableId.of(datasetId, recoverTableId),
        TableId.of(datasetId, snapshotTableId))
    .build();
Job job = bigquery.create(JobInfo.of(configuration));
job = job.waitFor();

// Check the table
StandardTableDefinition table = bigquery.getTable(
        TableId.of(datasetId, recoverTableId)).getDefinition();
System.out.println("State: " + job.getStatus().getState());
System.out.printf("Recovered %d rows.\n", table.getNumRows());

Python

이 샘플을 시도해 보기 전에 클라이언트 라이브러리를 사용하는 BigQuery 빠른 시작의 Python 설정 안내를 따르세요. 자세한 내용은 BigQuery Python API 참조 문서를 확인하세요.

# TODO(developer): Uncomment the lines below and replace with your values.
# import time
# from google.cloud import bigquery
# client = bigquery.Client()
# dataset_id = 'my_dataset'  # Replace with your dataset ID.
# table_id = 'my_table'      # Replace with your table ID.

table_ref = client.dataset(dataset_id).table(table_id)

# TODO(developer): Choose an appropriate snapshot point as epoch
# milliseconds. For this example, we choose the current time as we're about
# to delete the table immediately afterwards.
snapshot_epoch = int(time.time() * 1000)

# "Accidentally" delete the table.
client.delete_table(table_ref)  # API request

# Construct the restore-from table ID using a snapshot decorator.
snapshot_table_id = '{}@{}'.format(table_id, snapshot_epoch)
source_table_ref = client.dataset(dataset_id).table(snapshot_table_id)

# Choose a new table ID for the recovered table data.
recovered_table_id = '{}_recovered'.format(table_id)
dest_table_ref = client.dataset(dataset_id).table(recovered_table_id)

# Construct and run a copy job.
job = client.copy_table(
    source_table_ref,
    dest_table_ref,
    # Location must match that of the source and destination tables.
    location='US')  # API request

job.result()  # Waits for job to complete.

print('Copied data from deleted table {} to {}'.format(
    table_id, recovered_table_id))

다음 단계

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

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

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