뷰 만들기

이 문서에서는 BigQuery에서 뷰를 만드는 방법을 설명합니다.

다음과 같은 방법으로 BigQuery에서 뷰를 만들 수 있습니다.

  • Google Cloud 콘솔 사용
  • bq 명령줄 도구의 bq mk 명령어 사용
  • tables.insert API 메서드 호출
  • 클라이언트 라이브러리 사용
  • CREATE VIEW 데이터 정의 언어(DDL) 문 제출

뷰 제한사항

BigQuery 뷰에는 다음 제한사항이 적용됩니다.

  • 뷰는 읽기 전용입니다. 예를 들어 데이터를 삽입, 업데이트 또는 삭제하는 쿼리는 실행할 수 없습니다.
  • 뷰를 포함하는 데이터 세트와 뷰에서 참조되는 테이블을 포함하는 데이터 세트가 동일한 위치에 있어야 합니다.
  • 뷰 내부의 참조는 데이터 세트로 한정되어야 합니다. 기본 데이터 세트는 뷰 본문에 영향을 주지 않습니다.
  • TableDataList JSON API 메서드를 사용하여 뷰에서 데이터를 검색할 수 없습니다. 자세한 내용은 Tabledata: list를 참조하세요.
  • 뷰를 사용할 때는 GoogleSQL과 legacy SQL 쿼리를 혼합할 수 없습니다. GoogleSQL 쿼리는 legacy SQL 문법을 사용하여 정의된 뷰를 참조할 수 없습니다.
  • 뷰에서 쿼리 매개변수를 참조할 수 없습니다.
  • 기본 테이블의 스키마는 뷰를 만들 때 뷰와 함께 저장됩니다. 뷰를 만든 후 열이 추가, 삭제 또는 수정된 경우 뷰가 자동으로 업데이트되지 않으며 뷰 SQL 정의가 변경되거나 뷰를 다시 만들 때까지 보고된 스키마가 부정확한 상태로 유지됩니다. 보고된 스키마가 정확하지 않더라도 제출된 쿼리는 모두 정확한 결과를 생성합니다.
  • 자동으로 legacy SQL 뷰를 GoogleSQL 문법으로 업데이트할 수 없습니다. 뷰를 정의하는 데 사용된 쿼리를 수정하려면 다음을 사용하면 됩니다.
  • 뷰를 정의하는 SQL 쿼리에 임시 사용자 정의 함수나 임시 테이블을 포함할 수 없습니다.
  • 와일드 카드 테이블 쿼리에서 뷰를 참조할 수 없습니다.

뷰에 적용되는 할당량과 한도에 대한 자세한 내용은 뷰 한도를 참조하세요.

시작하기 전에

사용자에게 이 문서의 각 작업을 수행하는 데 필요한 권한을 부여하는 Identity and Access Management(IAM) 역할을 부여합니다.

필수 권한

뷰는 BigQuery에서 테이블 리소스로 취급되므로 뷰를 만들려면 테이블을 만들 때와 동일한 권한이 필요합니다. 뷰의 SQL 쿼리에서 참조하는 모든 테이블을 쿼리할 권한도 필요합니다.

뷰를 만들려면 bigquery.tables.create IAM 권한이 필요합니다. 사전 정의된 IAM 역할 roles/bigquery.dataEditor에는 뷰를 만드는 데 필요한 권한이 포함됩니다.

또한 bigquery.datasets.create 권한이 있으면 사용자가 만든 데이터 세트에 뷰를 만들 수 있습니다. 소유하지 않은 데이터의 뷰를 만들려면 해당 테이블에 대한 bigquery.tables.getData 권한이 있어야 합니다.

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

뷰 이름 지정

BigQuery에서 뷰를 만드는 경우 뷰 이름은 데이터 세트별로 고유해야 합니다. 뷰 이름은 다음을 포함할 수 있습니다.

  • 최대 총 1,024 UTF-8 바이트의 문자를 포함합니다.
  • L(문자), M(표시), N(숫자), Pc(밑줄 포함 커넥터), Pd(대시), Zs(공백) 카테고리의 유니코드를 포함합니다. 자세한 내용은 일반 카테고리를 참조하세요.

view 01, ग्राहक, 00_お客様, étudiant-01은 모두 유효한 뷰 이름 예시입니다.

주의사항:

  • 기본적으로 테이블 이름은 대소문자를 구분합니다. mytableMyTable대소문자 구분이 사용 중지된 데이터 세트에 속하지 않는 한 동일한 데이터 세트에 공존할 수 있습니다.
  • 일부 뷰 이름 및 뷰 이름 프리픽스는 예약되어 있습니다. 뷰 이름 또는 프리픽스가 예약되어 있다는 오류가 표시되면 다른 이름을 선택한 후 다시 시도하세요.
  • 시퀀스에 점 연산자(.)를 여러 개 포함하면 중복된 연산자가 암시적으로 삭제됩니다.

    예를 들어 원래 구문이 project_name....dataset_name..table_name이면

    구문이 project_name.dataset_name.table_name으로 바뀝니다.

뷰 만들기

뷰에 액세스할 수 있는 데이터를 정의하는 데 사용되는 SQL 쿼리를 작성하여 뷰를 만들 수 있습니다. SQL 쿼리는 SELECT 문으로 구성되어야 합니다. 다른 문 유형(예: DML 문) 및 다중 문 쿼리는 뷰 쿼리에서 허용되지 않습니다.

뷰를 만들려면 다음 안내를 따르세요.

Console

  1. 쿼리를 실행한 후 쿼리 결과 창 위에 있는 뷰 저장 버튼을 클릭하여 쿼리를 뷰로 저장합니다.

    뷰 저장

  2. 뷰 저장 대화상자에서 다음을 수행합니다.

    • 프로젝트 이름에서 뷰를 저장할 프로젝트를 선택합니다.
    • 데이터 세트 이름에서 뷰를 저장할 데이터 세트를 선택합니다. 뷰가 포함된 데이터 세트와 뷰에서 참조되는 테이블이 포함된 데이터 세트가 같은 위치에 있어야 합니다.
    • 테이블 이름에 뷰 이름을 입력합니다.
    • 저장을 클릭합니다.

SQL

CREATE VIEW을 사용합니다. 다음 예시는 미국 이름 공개 데이터 세트에서 usa_male_names라는 뷰를 만듭니다.

  1. Google Cloud 콘솔에서 BigQuery 페이지로 이동합니다.

    BigQuery로 이동

  2. 쿼리 편집기에서 다음 문을 입력합니다.

    CREATE VIEW mydataset.usa_male_names(name, number) AS (
      SELECT
        name,
        number
      FROM
        bigquery-public-data.usa_names.usa_1910_current
      WHERE
        gender = 'M'
      ORDER BY
        number DESC
    );

  3. 실행을 클릭합니다.

쿼리를 실행하는 방법에 대한 자세한 내용은 대화형 쿼리 실행을 참조하세요.

bq

bq mk 명령어--view 플래그와 함께 사용합니다. GoogleSQL 쿼리의 경우 --use_legacy_sql 플래그를 추가하고 false로 설정합니다. 선택적 파라미터에는 --add_tags, --expiration, --description, --label이 포함됩니다. 전체 파라미터 목록은 bq mk 명령어 참조를 확인하세요.

쿼리에서 Cloud Storage 또는 로컬 파일에 저장된 외부 사용자 정의 함수(UDF) 리소스를 참조하는 경우 --view_udf_resource 플래그를 사용하여 리소스를 지정합니다. --view_udf_resource 플래그는 여기서 설명하지 않습니다. UDF 사용에 대한 자세한 내용은 UDF를 참조하세요.

기본 프로젝트 이외의 프로젝트에 뷰를 만드는 경우 --project_id 플래그를 사용하여 프로젝트 ID를 지정합니다.

bq mk \
--use_legacy_sql=false \
--view_udf_resource=PATH_TO_FILE \
--expiration=INTEGER \
--description="DESCRIPTION" \
--label=KEY_1:VALUE_1 \
--add_tags=KEY_2:VALUE_2[,...] \
--view='QUERY' \
--project_id=PROJECT_ID \
DATASET.VIEW

다음을 바꿉니다.

  • PATH_TO_FILE은 뷰에 사용되는 UDF 리소스이며, 즉시 로드 및 평가될 코드 파일의 URI 또는 로컬 파일 시스템 경로입니다. 여러 파일을 지정하려면 플래그를 반복합니다.
  • INTEGER은 뷰의 수명(초 단위)을 설정합니다. INTEGER0이면 뷰가 만료되지 않습니다. --expiration 플래그를 포함하지 않으면 BigQuery에서 데이터 세트의 기본 테이블 수명으로 뷰를 만듭니다.
  • DESCRIPTION은 따옴표로 묶인 뷰에 대한 설명입니다.
  • KEY_1:VALUE_1라벨을 나타내는 키-값 쌍입니다. 여러 라벨을 지정하려면 --label 플래그를 반복합니다.
  • KEY_2:VALUE_2라벨을 나타내는 키-값 쌍입니다. 동일한 플래그 아래에 키-값 쌍 사이에 쉼표를 사용하여 여러 태그를 추가합니다.
  • QUERY는 유효한 쿼리입니다.
  • PROJECT_ID는 프로젝트 ID입니다(기본 프로젝트를 구성하지 않은 경우).
  • DATASET는 프로젝트의 데이터 세트입니다.
  • VIEW는 만들려는 뷰의 이름입니다.

예를 들면 다음과 같습니다.

다음 명령어를 입력하여 기본 프로젝트의 mydatasetmyview라는 이름의 뷰를 만듭니다. 테이블 만료 시간은 3,600초(1시간)로, 설명은 This is my view로, 라벨은 organization:development로 설정됩니다. 뷰를 만드는 데 사용되는 쿼리는 USA Name Data 공개 데이터 세트의 데이터를 쿼리합니다.

bq mk \
--use_legacy_sql=false \
--expiration 3600 \
--description "This is my view" \
--label organization:development \
--view \
'SELECT
  name,
  number
FROM
  `bigquery-public-data.usa_names.usa_1910_current`
WHERE
  gender = "M"
ORDER BY
  number DESC' \
mydataset.myview

다음 명령어를 입력하여 myotherprojectmydatasetmyview라는 이름의 뷰를 만듭니다. 설명은 This is my view로, 라벨은 organization:development로 설정되고 뷰 만료 시간은 데이터 세트의 기본 테이블 만료 시간으로 설정됩니다. 뷰를 만드는 데 사용되는 쿼리는 USA Name Data 공개 데이터 세트의 데이터를 쿼리합니다.

bq mk \
--use_legacy_sql=false \
--description "This is my view" \
--label organization:development \
--project_id myotherproject \
--view \
'SELECT
  name,
  number
FROM
  `bigquery-public-data.usa_names.usa_1910_current`
WHERE
  gender = "M"
ORDER BY
  number DESC' \
mydataset.myview

뷰를 만든 후 뷰의 만료 시간, 설명, 라벨을 업데이트할 수 있습니다. 자세한 내용은 뷰 업데이트를 참조하세요.

Terraform

google_bigquery_table 리소스를 사용합니다.

BigQuery에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 클라이언트 라이브러리의 인증 설정을 참조하세요.

다음 예시에서는 이름이 myview인 뷰를 만듭니다.

resource "google_bigquery_dataset" "default" {
  dataset_id                      = "mydataset"
  default_partition_expiration_ms = 2592000000  # 30 days
  default_table_expiration_ms     = 31536000000 # 365 days
  description                     = "dataset description"
  location                        = "US"
  max_time_travel_hours           = 96 # 4 days

  labels = {
    billing_group = "accounting",
    pii           = "sensitive"
  }
}

resource "google_bigquery_table" "default" {
  dataset_id          = google_bigquery_dataset.default.dataset_id
  table_id            = "myview"
  deletion_protection = false # set to "true" in production

  view {
    query          = "SELECT global_id, faa_identifier, name, latitude, longitude FROM `bigquery-public-data.faa.us_airports`"
    use_legacy_sql = false
  }

}

Google Cloud 프로젝트에 Terraform 구성을 적용하려면 다음 섹션의 단계를 완료하세요.

Cloud Shell 준비

  1. Cloud Shell을 실행합니다.
  2. Terraform 구성을 적용할 기본 Google Cloud 프로젝트를 설정합니다.

    이 명령어는 프로젝트당 한 번만 실행하면 되며 어떤 디렉터리에서도 실행할 수 있습니다.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    Terraform 구성 파일에서 명시적 값을 설정하면 환경 변수가 재정의됩니다.

디렉터리 준비

각 Terraform 구성 파일에는 자체 디렉터리(루트 모듈이라고도 함)가 있어야 합니다.

  1. Cloud Shell에서 디렉터리를 만들고 해당 디렉터리 내에 새 파일을 만드세요. 파일 이름에는 .tf 확장자가 있어야 합니다(예: main.tf). 이 튜토리얼에서는 파일을 main.tf라고 합니다.
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. 튜토리얼을 따라 하는 경우 각 섹션이나 단계에서 샘플 코드를 복사할 수 있습니다.

    샘플 코드를 새로 만든 main.tf에 복사합니다.

    필요한 경우 GitHub에서 코드를 복사합니다. 이는 Terraform 스니펫이 엔드 투 엔드 솔루션의 일부인 경우에 권장됩니다.

  3. 환경에 적용할 샘플 매개변수를 검토하고 수정합니다.
  4. 변경사항을 저장합니다.
  5. Terraform을 초기화합니다. 이 작업은 디렉터리당 한 번만 수행하면 됩니다.
    terraform init

    원하는 경우 최신 Google 공급업체 버전을 사용하려면 -upgrade 옵션을 포함합니다.

    terraform init -upgrade

변경사항 적용

  1. 구성을 검토하고 Terraform에서 만들거나 업데이트할 리소스가 예상과 일치하는지 확인합니다.
    terraform plan

    필요에 따라 구성을 수정합니다.

  2. 다음 명령어를 실행하고 프롬프트에 yes를 입력하여 Terraform 구성을 적용합니다.
    terraform apply

    Terraform에 '적용 완료' 메시지가 표시될 때까지 기다립니다.

  3. 결과를 보려면 Google Cloud 프로젝트를 엽니다. Google Cloud 콘솔에서 UI의 리소스로 이동하여 Terraform이 리소스를 만들었거나 업데이트했는지 확인합니다.

API

view 속성을 포함하는 테이블 리소스tables.insert 메서드를 호출합니다.

Go

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

BigQuery에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 클라이언트 라이브러리의 인증 설정을 참조하세요.

import (
	"context"
	"fmt"

	"cloud.google.com/go/bigquery"
)

// createView demonstrates creation of a BigQuery logical view.
func createView(projectID, datasetID, tableID string) error {
	// projectID := "my-project-id"
	// datasetID := "mydatasetid"
	// tableID := "mytableid"
	ctx := context.Background()

	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	meta := &bigquery.TableMetadata{
		// This example shows how to create a view of the shakespeare sample dataset, which
		// provides word frequency information.  This view restricts the results to only contain
		// results for works that contain the "king" in the title, e.g. King Lear, King Henry V, etc.
		ViewQuery: "SELECT word, word_count, corpus, corpus_date FROM `bigquery-public-data.samples.shakespeare` WHERE corpus LIKE '%king%'",
	}
	if err := client.Dataset(datasetID).Table(tableID).Create(ctx, meta); err != nil {
		return err
	}
	return nil
}

자바

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

BigQuery에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 클라이언트 라이브러리의 인증 설정을 참조하세요.

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.TableId;
import com.google.cloud.bigquery.TableInfo;
import com.google.cloud.bigquery.ViewDefinition;

// Sample to create a view
public class CreateView {

  public static void main(String[] args) {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    String tableName = "MY_TABLE_NAME";
    String viewName = "MY_VIEW_NAME";
    String query =
        String.format(
            "SELECT TimestampField, StringField, BooleanField FROM %s.%s", datasetName, tableName);
    createView(datasetName, viewName, query);
  }

  public static void createView(String datasetName, String viewName, String query) {
    try {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      TableId tableId = TableId.of(datasetName, viewName);

      ViewDefinition viewDefinition =
          ViewDefinition.newBuilder(query).setUseLegacySql(false).build();

      bigquery.create(TableInfo.of(tableId, viewDefinition));
      System.out.println("View created successfully");
    } catch (BigQueryException e) {
      System.out.println("View was not created. \n" + e.toString());
    }
  }
}

Node.js

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

BigQuery에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 클라이언트 라이브러리의 인증 설정을 참조하세요.

// Import the Google Cloud client library and create a client
const {BigQuery} = require('@google-cloud/bigquery');
const bigquery = new BigQuery();

async function createView() {
  // Creates a new view named "my_shared_view" in "my_dataset".

  /**
   * TODO(developer): Uncomment the following lines before running the sample.
   */
  // const myDatasetId = "my_table"
  // const myTableId = "my_table"
  // const projectId = "bigquery-public-data";
  // const sourceDatasetId = "usa_names"
  // const sourceTableId = "usa_1910_current";
  const myDataset = await bigquery.dataset(myDatasetId);

  // For all options, see https://cloud.google.com/bigquery/docs/reference/v2/tables#resource
  const options = {
    view: `SELECT name 
    FROM \`${projectId}.${sourceDatasetId}.${sourceTableId}\`
    LIMIT 10`,
  };

  // Create a new view in the dataset
  const [view] = await myDataset.createTable(myTableId, options);

  console.log(`View ${view.id} created.`);
}

Python

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

BigQuery에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 클라이언트 라이브러리의 인증 설정을 참조하세요.

from google.cloud import bigquery

client = bigquery.Client()

view_id = "my-project.my_dataset.my_view"
source_id = "my-project.my_dataset.my_table"
view = bigquery.Table(view_id)

# The source table in this example is created from a CSV file in Google
# Cloud Storage located at
# `gs://cloud-samples-data/bigquery/us-states/us-states.csv`. It contains
# 50 US states, while the view returns only those states with names
# starting with the letter 'W'.
view.view_query = f"SELECT name, post_abbr FROM `{source_id}` WHERE name LIKE 'W%'"

# Make an API request to create the view.
view = client.create_table(view)
print(f"Created {view.table_type}: {str(view.reference)}")

뷰를 만든 후 테이블을 쿼리하는 것처럼 뷰를 쿼리합니다.

뷰 보안

BigQuery에서 뷰에 대한 액세스를 제어하려면 승인된 뷰를 참조하세요.

다음 단계