뷰 만들기

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

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

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

뷰 제한사항

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

  • 뷰는 읽기 전용입니다. 뷰에 대한 DML(삽입, 업데이트, 삭제) 쿼리를 실행할 수 없습니다.
  • 뷰를 포함하는 데이터 세트와 뷰에서 참조되는 테이블을 포함하는 데이터 세트가 동일한 위치에 있어야 합니다.
  • 뷰에서 데이터를 내보내는 BigQuery 작업은 실행할 수 없습니다.
  • TableDataList JSON API 메서드를 사용하여 뷰에서 데이터를 검색할 수 없습니다. 자세한 내용은 Tabledata: list를 참조하세요.
  • 뷰를 사용할 때는 GoogleSQL과 legacy SQL 쿼리를 혼합할 수 없습니다. GoogleSQL 쿼리는 legacy 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자를 포함합니다.
  • L(문자), M(표시), N(숫자), Pc(밑줄 포함 커넥터), Pd(대시), Zs(공백) 카테고리의 유니코드를 포함합니다. 자세한 내용은 일반 카테고리를 참조하세요.

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

주의사항:

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

    예를 들어 원래 구문이 project_name....datasest_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로 설정합니다. 선택적 매개변수로는 --expiration, --description, --label이 있습니다.

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

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

bq mk \
--use_legacy_sql=false \
--view_udf_resource=PATH_TO_FILE \
--expiration INTEGER \
--description "DESCRIPTION" \
--label KEY:VALUE \
--view 'QUERY' \
--project_id PROJECT_ID \
DATASET.VIEW

다음을 바꿉니다.

  • PATH_TO_FILE은 뷰에 사용되는 UDF 리소스이며, 즉시 로드 및 평가될 코드 파일의 URI 또는 로컬 파일 시스템 경로입니다. 여러 파일을 지정하려면 플래그를 반복합니다.
  • INTEGER은 뷰의 수명(초 단위)을 설정합니다. INTEGER0이면 뷰가 만료되지 않습니다. --expiration 플래그를 포함하지 않으면 BigQuery에서 데이터 세트의 기본 테이블 수명으로 뷰를 만듭니다.
  • DESCRIPTION은 따옴표로 묶인 뷰에 대한 설명입니다.
  • KEY:VALUE라벨을 나타내는 키:값 쌍입니다. 여러 라벨을 지정하려면 --label 플래그를 반복합니다.
  • 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

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

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에서 뷰에 대한 액세스를 제어하려면 승인된 뷰를 참조하세요.

다음 단계