빅쿼리의 차세대 솔루션으로 데이터 웨어하우스 + 데이터 레이크의 형태
BigLake 는 멀티 클라우드 스토리지 및 개방형 형식을 통해 균일하고 세분화된 액세스 제어를 제공하여 데이터 웨어하우스 및 데이터 레이크에 대한 데이터 액세스를 단순화하는 통합 스토리지 엔진
BigLake 테이블은 Connection Resource를 사용하여 Google Cloud Storage 데이터에 액세스한다.
Connection Resource는 프로젝트의 단일 테이블 또는 임의의 테이블 그룹과 연결될 수 있다.
여기 옵션에서 볼 수 있다시피 빅쿼리 옴니를 이용해 여러 타 클라우드의 스토리지에서 데이터를 가져와서 빅쿼리에서 처리할 수 있다.
BigQuery가 Cloud Storage 파일에 액세스할 수 있도록 새 Connection Resource에 Cloud Storage 데이터 레이크에 대한 읽기 전용 액세스 권한을 부여할 수 있다.
Connection Resource 서비스 계정에 Storage Object Viewer IAM 역할을 부여하여 서비스 계정이 Cloud Storage 버킷에 액세스할 수 있도록 하자.
위에서 만들어준 Connection Resource와 연결
스키마
[
{
"name": "customer_id",
"type": "INTEGER",
"mode": "REQUIRED"
},
{
"name": "first_name",
"type": "STRING",
"mode": "REQUIRED"
},
{
"name": "last_name",
"type": "STRING",
"mode": "REQUIRED"
},
{
"name": "company",
"type": "STRING",
"mode": "NULLABLE"
},
{
"name": "address",
"type": "STRING",
"mode": "NULLABLE"
},
{
"name": "city",
"type": "STRING",
"mode": "NULLABLE"
},
{
"name": "state",
"type": "STRING",
"mode": "NULLABLE"
},
{
"name": "country",
"type": "STRING",
"mode": "NULLABLE"
},
{
"name": "postal_code",
"type": "STRING",
"mode": "NULLABLE"
},
{
"name": "phone",
"type": "STRING",
"mode": "NULLABLE"
},
{
"name": "fax",
"type": "STRING",
"mode": "NULLABLE"
},
{
"name": "email",
"type": "STRING",
"mode": "REQUIRED"
},
{
"name": "support_rep_id",
"type": "INTEGER",
"mode": "NULLABLE"
}
]
BigLake 테이블 생성
BigLake 테이블이 생성되면 BigQuery 테이블과 유사한 방식으로 관리가 가능하다.
BigLake 테이블에 대한 액세스 제어 정책을 생성하려면 먼저 Data Catalog 에서 정책 태그를 생성해야 한다.
그럼 그 정책 태그를 중요한 행이나 열에 적용할 수 있다.
열 수준의 정책을 만들어 보자.
여기선 이미 만들어놓은 Data Catalog의 태그가 존재.
위에서 만들어준 빅쿼리 biglake_table 테이블로 이동 후 스키마 편집
위 사진과 같은 형식으로 태그가 지정된다.
SELECT * FROM `<프로젝트 ID>.demo_dataset.biglake_table`
위의 쿼리를 돌리면 쿼리가 되지 않고 아래의 쿼리를 돌리면 쿼리가 성공하는 것을 확인할 수 있다.
권한이 있는 열에 대해서만 조회할 수 있기 때문.
SELECT * EXCEPT(address, phone, postal_code)
FROM `<프로젝트 ID>.demo_dataset.biglake_table`
Connection Resource 사용 x
스키마
[
{
"name": "invoice_id",
"type": "INTEGER",
"mode": "REQUIRED"
},
{
"name": "customer_id",
"type": "INTEGER",
"mode": "REQUIRED"
},
{
"name": "invoice_date",
"type": "TIMESTAMP",
"mode": "REQUIRED"
},
{
"name": "billing_address",
"type": "STRING",
"mode": "NULLABLE"
},
{
"name": "billing_city",
"type": "STRING",
"mode": "NULLABLE"
},
{
"name": "billing_state",
"type": "STRING",
"mode": "NULLABLE"
},
{
"name": "billing_country",
"type": "STRING",
"mode": "NULLABLE"
},
{
"name": "billing_postal_code",
"type": "STRING",
"mode": "NULLABLE"
},
{
"name": "total",
"type": "NUMERIC",
"mode": "REQUIRED"
}
]
테이블 생성
Cloud Shell 활성화한 후 아래 쿼리 입력
export PROJECT_ID=$(gcloud config get-value project)
bq mkdef \
--autodetect \
--connection_id=$PROJECT_ID.US.my-connection \
--source_format=CSV \
"gs://$PROJECT_ID/invoice.csv" > /tmp/tabledef.json
테이블에서 스키마를 가져온다
bq show --schema --format=prettyjson demo_dataset.external_table > /tmp/schema
새 외부 테이블 정의를 사용하여 테이블 업데이트
bq update --external_table_definition=/tmp/tabledef.json --schema=/tmp/schema demo_dataset.external_table
external_table 테이블에서 확인
기존 외부 테이블을 Connection Resource에 연결하여 BigLake 테이블로 성공적으로 업그레이드한 것을 확인할 수 있다.