BigQuery - Bigtable을 External Table로 접근하기

Jay Park·2021년 11월 24일
0

Bigtable External Table in BigQuery

Bigtable을 외부 데이터 소스로 External Table을 생성할 때 필요한 테이블 정의 파일 (table definition file) 다뤄보고 간단한 Poc를 통해 BigQuery로 Bigtable에 접근 가능한지 확인해 보자.

Cloud Storage나 Google Drive는 BigQuery DDL 문으로도 외부 테이블 생성 [1] 이 가능하므로 여기서는 쿼리로 외부 테이블 생성이 불가능한 Bigtable에 대해서만 언급한다.

테이블 정의 파일

테이블 정의 파일에는 외부 테이블의 스키마와 메타 정보를 담고 있다. Bigtable을 BigQuery의 외부 테이블로 만들기 위해서는 둘 간의 스키마 불일치 어떻게 조화시킬 것인가가 관건인데 그 과정에서 테이블 정의 파일은 핵심적인 역할을 담당하다.

테이블 정의 파일은 아래 3가지 옵션 중 하나를 사용하여 생성할 수 있다.

  • 스키마 자동 탐지 -auto-detection
  • 인라인 스키마 지정
  • 스키마 정의 JSON 파일 제공

테이블 정의 파일bq 명령행 도구와 더불어 사용된다. (REST API 사용은 추후에..)
Cloud Console 에서 외부 테이블 생성시에는 필요치 않다.

지원되는 외부 데이터 소스는 아래와 같다.

  • Cloud Storage
    • Comma-separated values (CSV)
    • Newline-delimited JSON
    • Avro/ORC/Parquet files
    • ...
  • Google Drive
    • Comma-separated values (CSV)
    • Newline-delimited JSON
    • Google Sheets
    • ...
  • Cloud Bigtable

Creating Cloud Bigtable table definitions

Cloud Storage에 대해서는 bq mkdef 명령이나 auto-detection 방식으로 테이블 정의 파일 생성이 가능하나 Bigtable에 대해서는 매뉴얼하게 JSON 형식의 파일을 생성해야 한다.

먼저, 데이터 소스의 URI가 필요하다. 아래 내용을 참고하여 Bigtable 리소스의 URI를 확인해 두자.

다음 아래 JSON 형식의 테이블 정의 파일을 만든다.

{
  "sourceFormat": "BIGTABLE",
  "sourceUris": [
    "https://googleapis.com/bigtable/projects/project_id/instances/instance_id/tables/table_name"
  ],
  "bigtableOptions": {
    "columnFamilies": [
      {
        "familyId": "family_int",
        "type": "INTEGER",
        "encoding": "BINARY"
      }
    ]
  }
}

JSON 형식의 세부 내용은 아래를 참고하여 채우도록 한다.

bigtableOptions

{
  "columnFamilies": [
    {
      object (BigtableColumnFamily)
    }
  ],
  "ignoreUnspecifiedColumnFamilies": boolean,
  "readRowkeyAsString": boolean
}

BigtableColumnFamily

{
  "familyId": string,
  "type": string,
  "encoding": string,
  "columns": [
    {
      object (BigtableColumn)
    }
  ],
  "onlyReadLatest": boolean
}

BigtableColumnFamily

{
  "qualifierEncoded": string,
  "qualifierString": string,
  "fieldName": string,
  "type": string,
  "encoding": string,
  "onlyReadLatest": boolean
}

BigQuery External Table 생성

실제 내용을 바탕으로 간단히 PoC 진행한 내용은 다음과 같다.

0. Bigtable 테이블 준비

Bigtable에 table과 comlumn family를 생성하고 샘플 데이터 하나를 추가한다.

$cbt createtable hello-bt
$cbt createfamily hello-bt cf1
$cbt set hello-bt r1 cf1:c1=test-value

1. 테이블 정의 파일 생성

사전에 파악 Bigtable URI를 가지고 테이블 정의 파일을 생성한다. (Bigtable URI는 일부 마스킹)

  • hello_tbl_def.json 내용
{
    "sourceFormat": "BIGTABLE",
    "sourceUris": [
        "https://googleapis.com/bigtable/projects/*****/instances/*****/tables/*****"
    ],
    "bigtableOptions": {
        "columnFamilies" : [
            {
                "familyId": "cf1",
                "type": "STRING",
                "encoding": "BINARY"
            }
        ]
    }
}

2. BigQuery External Table 생성

$bq mk --external_table_definition=hello_tbl_def.json poc_bdp.hello_bt

위의 bq 명령문을 실행하면 테이블 정의 파일 파일에 기술된 내용을 바탕으로 BigQuery 데이터셋에서 아래와 같은 스키마를 갖는 외부 테이블이 만들어진다.

Bigtable의 column family는 BigQuery의 구조체(STRUCT)로 매핑된 것을 확인할 수 있다.

3. External Table 조회

SELECT 문을 이용하여 외부 테이블을 조회해 보자.

SELECT * FROM poc_bdp.hello_bt LIMIT 1;
Rowrowkeycf1.column.namecf1.column.cell.timestampcf1.column.cell.value
1cjE=c12021-11-24 06:47:47.225 UTChello-bt

Column Family의 값들은 정상적으로 디코딩되어 보여지는데 rowkey는 바이너리 형태로 보여지고 있다. SAFE_CONVERT_BYTES_TO_STRING() 함수를 이용해서 STRING으로 변환시켜 보자.

SELECT * REPLACE(SAFE_CONVERT_BYTES_TO_STRING(rowkey) AS rowkey) 
  FROM poc_bdp.hello_bt
 LIMIT 1;
Rowrowkeycf1.column.namecf1.column.cell.timestampcf1.column.cell.value
1r1c12021-11-24 06:47:47.225 UTChello-bt

간단한 PoC를 통해 Bigtable을 외부 테이블로 하여 BigQuery에서 직접 접근 가능함을 확인하였다.

향후 계획

참고자료

  1. BigQuery Hands-On - Kaggle Data Survey
  2. Quickstart using the cbt tool
profile
Jaytiger

0개의 댓글