Azure Storage 데이터용 외부 테이블 만들기

BigQuery Omni는 Azure Storage에 저장된 데이터를 관리하지 않습니다. Azure Storage 데이터에 액세스하려면 외부 테이블을 정의합니다.

데이터 세트 만들기

azure-eastus2 위치를 사용하여 데이터 세트를 만듭니다.

Console

  1. Google Cloud 콘솔에서 BigQuery 페이지를 엽니다.

    BigQuery로 이동

  2. 탐색 패널의 리소스 섹션에서 프로젝트를 선택합니다.

  3. 세부정보 패널에서 데이터 세트 만들기를 클릭합니다.

  4. 데이터 세트 만들기 페이지에서 다음 정보를 입력합니다.

    • 데이터 세트 ID에 고유한 데이터 세트 이름을 입력합니다.
    • 데이터 위치azure-eastus2를 선택합니다.

    • 기본 테이블 만료에서 다음 옵션 중 하나를 선택합니다.

      • 사용 안 함: (기본값)데이터 세트에 만든 테이블이 자동으로 삭제되지 않습니다. 수동으로 삭제해야 합니다.
      • 테이블 생성 후 경과 일수: 이 값은 데이터 세트에서 새로 만든 테이블이 삭제되는 시기를 결정합니다. 테이블이 생성될 때 테이블 만료 시간을 설정하지 않은 경우 이 값이 적용됩니다. 테이블이 만료될 때 Azure의 데이터가 삭제되지 않습니다.
    • 데이터 세트 만들기를 클릭합니다.

SQL

CREATE SCHEMA DDL 문을 사용합니다.

  1. Console에서 BigQuery 페이지로 이동합니다.

    BigQuery로 이동

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

    CREATE SCHEMA mydataset
    OPTIONS (
      location = 'azure-eastus2');
    

  3. 실행을 클릭합니다.

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

bq

새 데이터 세트를 만들려면 --location 플래그와 함께 bq mk 명령어를 실행합니다. 선택적 매개변수에는 --default_table_expiration, --description이 있습니다.

기본 프로젝트가 아닌 다른 프로젝트에서 데이터 세트를 만들려면 해당 프로젝트 ID를 PROJECT_ID:DATASET_NAME 형식으로 데이터 세트 이름에 추가합니다.

bq --location=LOCATION mk \
    --dataset \
    --default_table_expiration INTEGER1 \
    --description DESCRIPTION \
    PROJECT_ID:DATASET_NAME

다음을 바꿉니다.

  • LOCATION: 데이터 세트의 위치입니다. azure-eastus2로 바꿉니다. 데이터 세트를 만든 후에는 위치를 변경할 수 없습니다. .bigqueryrc 파일을 사용하여 위치 기본값을 설정할 수 있습니다.
  • INTEGER1: 새로 생성된 테이블의 기본 수명(초)입니다. 최솟값은 3600(1시간)입니다. 만료 시간은 현재 시간과 정수 값을 더한 값으로 계산됩니다. 데이터 세트에서 생성된 모든 테이블은 테이블 생성 시간으로부터 INTEGER1초 후에 삭제됩니다. 테이블을 만들 때 테이블 만료 시간을 설정하지 않으면 이 값이 적용됩니다.
  • DESCRIPTION: 따옴표로 묶인 데이터 세트 설명입니다.
  • PROJECT_ID: 프로젝트 ID
  • DATASET_NAME: 만들려는 데이터 세트의 이름입니다.

외부 테이블 만들기

필수 권한

BigQuery에서 외부 테이블을 만들려면 다음 Identity and Access Management(IAM) 권한이 필요합니다.

  • bigquery.tables.create
  • bigquery.tables.getData
  • bigquery.jobs.create
  • bigquery.connections.delegate

사전 정의된 IAM 역할 roles/bigquery.admin에는 외부 테이블을 만드는 데 필요한 권한이 포함됩니다. 자세한 내용은 IAM으로 액세스 제어를 참조하세요.

외부 테이블 만들기

외부 테이블을 만들려면 다음 단계를 따르세요.

Console

  1. Google Cloud 콘솔에서 BigQuery 페이지를 엽니다.

    BigQuery로 이동

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

  3. 작업 옵션을 펼치고 열기를 클릭합니다.

  4. 세부정보 패널에서 테이블 만들기를 클릭합니다.

  5. 테이블 만들기 페이지의 소스 섹션에서 다음을 수행합니다.

    • 다음 항목으로 테이블 만들기에서 Azure Blob Storage를 선택합니다.
    • Azure Blob Storage 경로 선택에서 azure://AZURE_STORAGE_ACCOUNT_NAME.blob.core.windows.net/CONTAINER_NAME/FILE_PATH 형식을 사용하여 Azure Blob Storage 경로를 입력합니다.

      다음을 바꿉니다.

      • AZURE_STORAGE_ACCOUNT_NAME: Azure Storage 계정의 이름 계정 리전은 데이터 세트의 리전과 동일해야 합니다.
      • CONTAINER_NAME: Azure 컨테이너의 이름
      • FILE_PATH: Azure Storage 데이터를 가리키는 데이터 경로 예를 들어 단일 CSV 파일의 경우에는 FILE_PATHmyfile.csv일 수 있습니다.
    • 파일 형식에 Azure의 데이터 형식을 선택합니다. 지원되는 형식은 AVRO, PARQUET, ORC, CSV, NEWLINE_DELIMITED_JSON, Sheets입니다.

  6. 선택사항: Azure Blob Storage의 데이터에 Hive 파티션 나누기가 사용되는 경우 다음을 수행합니다.

    • 소스 데이터 파티션 나누기 체크박스를 선택합니다.
    • Azure Blob Storage 경로 선택 필드에 와일드 카드 형식을 사용하여 Azure Blob Storage 경로를 입력합니다. 예를 들면 azure://account_name.blob.core.windows.net/container/*.입니다.
    • 소스 URI 프리픽스 선택 필드에 URI 프리픽스를 입력합니다. URI 프리픽스는 파티션 인코딩 앞에 표시되는 URI 부분입니다. 예를 들면 azure://account_name.blob.core.windows.net/container/입니다.
    • 파티션 추론 모드를 선택합니다. 직접 제공을 선택한 경우 파티션 키의 스키마 정보를 입력합니다.
  7. 테이블 만들기 페이지의 대상 섹션에서 다음을 수행합니다.

    • 데이터세트 이름에서 적절한 데이터세트를 선택합니다.
    • 테이블 이름 필드에 생성 중인 테이블의 이름을 입력합니다.
    • 테이블 유형외부 테이블로 설정되어 있는지 확인합니다.
    • 연결 ID의 경우 드롭다운에서 적절한 연결 ID를 선택합니다.
  8. 테이블 만들기를 클릭합니다.

SQL

외부 테이블을 만들려면 CREATE EXTERNAL TABLE 문을 사용합니다.

  1. Console에서 BigQuery 페이지로 이동합니다.

    BigQuery로 이동

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

    CREATE EXTERNAL TABLE DATASET_NAME.TABLE_NAME
    WITH CONNECTION `AZURE_LOCATION.CONNECTION_NAME`
      OPTIONS (
        format = 'DATA_FORMAT',
        uris = ['abs://AZURE_STORAGE_ACCOUNT_NAME/CONTAINER_NAME/FILE_PATH']);
    

    다음을 바꿉니다.

    • DATASET_NAME: 사용자가 만든 데이터 세트의 이름
    • TABLE_NAME: 이 테이블에 지정할 이름
    • AZURE_LOCATION: Google Cloud의 Azure 위치(예: azure-eastus2)
    • CONNECTION_NAME: 사용자가 만든 연결의 이름
    • DATA_FORMAT: 지원되는 BigQuery 제휴 형식(예: AVRO 또는 CSV)
    • AZURE_STORAGE_ACCOUNT_NAME: Azure Storage 계정의 이름
    • CONTAINER_NAME: Azure 컨테이너의 이름
    • FILE_PATH: Azure Storage 데이터를 가리키는 데이터 경로

  3. 실행을 클릭합니다.

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

예:

CREATE EXTERNAL TABLE absdataset.abstable
WITH CONNECTION `azure-eastus2.abs-read-conn`
  OPTIONS (
    format = 'CSV', uris = ['abs://account/container/path/file.csv']);

bq

테이블 정의 파일을 만듭니다.

bq mkdef  \
    --source_format=DATA_FORMAT \
    --connection_id=AZURE_LOCATION.CONNECTION_NAME \
    "azure://AZURE_STORAGE_ACCOUNT_NAME.blob.core.windows.net/CONTAINER_NAME/FILE_PATH" > table_def

다음을 바꿉니다.

  • DATA_FORMAT: 지원되는 BigQuery 제휴 형식(예: AVRO, CSV, PARQUET)(대문자)
  • AZURE_LOCATION: Google Cloud의 Azure 위치(예: azure-eastus2)
  • CONNECTION_NAME: 사용자가 만든 연결의 이름
  • AZURE_STORAGE_ACCOUNT_NAME: Azure Storage 계정의 이름
  • CONTAINER_NAME: Azure 컨테이너의 이름
  • FILE_PATH: Azure Storage 데이터를 가리키는 데이터 경로

그런 후 외부 테이블을 만듭니다.

bq mk --external_table_definition=table_def DATASET_NAME.TABLE_NAME

다음을 바꿉니다.

  • DATASET_NAME: 생성한 데이터 세트의 이름
  • TABLE_NAME: 이 테이블에 지정할 이름

예를 들어 다음 명령어는 azure://account_name.blob.core.windows.net/container/path 경로에 저장되고 azure-eastus2 위치에 읽기 연결이 있는 Azure Storage 데이터를 쿼리할 수 있는 새 외부 테이블 my_dataset.my_table을 만듭니다.

bq mkdef \
    --source_format=AVRO \
    --connection_id=azure-eastus2.read-conn \
    "azure://account_name.blob.core.windows.net/container/path" > table_def

bq mk \
    --external_table_definition=table_def my_dataset.my_table

Hive 파티션 나누기

Azure Blob Storage의 데이터에 Hive 파티션 나누기가 사용되는 경우 다음과 같이 테이블 정의 파일을 만듭니다.

bq mkdef  \
    --source_format=DATA_FORMAT \
    --connection_id=AZURE_LOCATION.CONNECTION_NAME \
    --hive_partitioning_mode=HIVE_PARTITIONING_MODE \
    --hive_partitioning_source_uri_prefix=HIVE_PARTITIONING_URI_PRFEFIX
    "azure://AZURE_STORAGE_ACCOUNT_NAME.blob.core.windows.net/CONTAINER_NAME/FILE_PATH" > table_def

다음을 바꿉니다.

  • HIVE_PARTITIONING_MODE: 파티션 스키마 감지 모드
  • HIVEPARTITIONING: 파티션 인코딩 앞에 표시되는 URI의 일부인 URI 프리픽스(예: azure://account_name.blob.core.windows.net/container/)

테이블 쿼리

BigQuery Omni를 사용하면 BigQuery 테이블과 같은 외부 테이블을 쿼리할 수 있습니다. 대화형 쿼리의 최대 결과 크기는 2MB입니다. 쿼리 결과가 큰 경우 Azure Storage로 내보내는 것이 좋습니다. 쿼리 결과는 BigQuery 익명 테이블(prod spanner)에 저장됩니다.

BigQuery 테이블에서와 같이 외부 테이블에서 쿼리를 실행합니다.

SQL

  1. Console에서 BigQuery 페이지로 이동합니다.

    BigQuery로 이동

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

    SELECT * FROM DATASET_NAME.TABLE_NAME;
    

    다음을 바꿉니다.

    • DATASET_NAME: 생성한 데이터 세트의 이름
    • TABLE_NAME: 생성한 외부 테이블의 이름

  3. 실행을 클릭합니다.

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

자바

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

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.CsvOptions;
import com.google.cloud.bigquery.DatasetId;
import com.google.cloud.bigquery.ExternalTableDefinition;
import com.google.cloud.bigquery.Field;
import com.google.cloud.bigquery.QueryJobConfiguration;
import com.google.cloud.bigquery.Schema;
import com.google.cloud.bigquery.StandardSQLTypeName;
import com.google.cloud.bigquery.TableId;
import com.google.cloud.bigquery.TableInfo;
import com.google.cloud.bigquery.TableResult;

// Sample to queries an external data source aws s3 using a permanent table
public class QueryExternalTableAws {

  public static void main(String[] args) throws InterruptedException {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "MY_PROJECT_ID";
    String datasetName = "MY_DATASET_NAME";
    String externalTableName = "MY_EXTERNAL_TABLE_NAME";
    // Query to find states starting with 'W'
    String query =
        String.format(
            "SELECT * FROM s%.%s.%s WHERE name LIKE 'W%%'",
            projectId, datasetName, externalTableName);
    queryExternalTableAws(query);
  }

  public static void queryExternalTableAws(String query) throws InterruptedException {
    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();

      TableResult results = bigquery.query(QueryJobConfiguration.of(query));

      results
          .iterateAll()
          .forEach(row -> row.forEach(val -> System.out.printf("%s,", val.toString())));

      System.out.println("Query on aws external permanent table performed successfully.");
    } catch (BigQueryException e) {
      System.out.println("Query not performed \n" + e.toString());
    }
  }
}

INFORMATION_SCHEMA로 리소스 메타데이터 보기

JOBS_BY_*, JOBS_TIMELINE_BY_*, RESERVATION* BigQuery INFORMATION_SCHEMA 보기를 쿼리할 때는 쿼리 처리 위치를 테이블 리전과 함께 배치된 us-east4(북 버지니아)로 지정해야 합니다. 위치를 지정하지 않으면 작업이 실패합니다. 다른 모든 시스템 테이블의 경우 쿼리 작업 위치 지정은 선택사항입니다.

BigQuery Omni에서 지원되는 시스템 테이블에 대한 자세한 내용은 제한사항을 참조하세요.

JOBS_*RESERVATION* 시스템 테이블을 쿼리하려면 처리 위치를 다음과 같이 지정합니다.

Console

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

    BigQuery로 이동

  2. 편집기 탭이 표시되지 않으면 새 쿼리 작성을 클릭합니다.

  3. 더보기 > 쿼리 설정을 클릭합니다. 쿼리 설정 대화상자가 열립니다.

    쿼리 설정

  4. 쿼리 설정 대화상자에서 추가 설정 > 데이터 위치us-east4(북버지니아)를 선택합니다.

  5. 나머지 필드를 선택하고 저장을 클릭합니다.

bq

--location 플래그를 사용해서 작업의 처리 위치를 us-east4로 설정합니다.

예시

bq --use_legacy_sql=false --location=us-east4 \
"SELECT * FROM region-azure-eastus2.INFORMATION_SCHEMA.JOBS limit 10;"

API

프로그래매틱 방식으로 작업을 실행하는 경우 location 인수를 us-east4로 설정해야 합니다.

다음 단계