Bigtable을 외부 데이터 소스로 External Table
을 생성할 때 필요한 테이블 정의 파일 (table definition file)
다뤄보고 간단한 Poc를 통해 BigQuery로 Bigtable에 접근 가능한지 확인해 보자.
Cloud Storage나 Google Drive는 BigQuery DDL 문으로도 외부 테이블 생성 [1] 이 가능하므로 여기서는 쿼리로 외부 테이블 생성이 불가능한 Bigtable에 대해서만 언급한다.
테이블 정의 파일
에는 외부 테이블의 스키마와 메타 정보를 담고 있다. Bigtable을 BigQuery의 외부 테이블로 만들기 위해서는 둘 간의 스키마 불일치 어떻게 조화시킬 것인가가 관건인데 그 과정에서 테이블 정의 파일
은 핵심적인 역할을 담당하다.
테이블 정의 파일
은 아래 3가지 옵션 중 하나를 사용하여 생성할 수 있다.
auto-detection
테이블 정의 파일
은 bq
명령행 도구와 더불어 사용된다. (REST API 사용은 추후에..)
Cloud Console 에서 외부 테이블 생성시에는 필요치 않다.
지원되는 외부 데이터 소스는 아래와 같다.
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
}
실제 내용을 바탕으로 간단히 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는 일부 마스킹)
{
"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;
Row | rowkey | cf1.column.name | cf1.column.cell.timestamp | cf1.column.cell.value |
---|---|---|---|---|
1 | cjE= | c1 | 2021-11-24 06:47:47.225 UTC | hello-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;
Row | rowkey | cf1.column.name | cf1.column.cell.timestamp | cf1.column.cell.value |
---|---|---|---|---|
1 | r1 | c1 | 2021-11-24 06:47:47.225 UTC | hello-bt |
간단한 PoC를 통해 Bigtable을 외부 테이블로 하여 BigQuery에서 직접 접근 가능함을 확인하였다.
bigtableOptions
세부 옵션 분석