이어서 계속
네트워크 오버헤드 최소화하기
압축한 부분 응답
여러 요청 일괄 처리하기
%pip install google-cloud-bigquery-storage[fastavro, pandas]
%%bigquery df --use_bqstorage_api --project $PROJECT
SELECT
start_station_name
, end_station_name
, start_date
, duration
FROM `bigquery-public-data`.london_bicycles.cycle_hire
import google.cloud.bigquery.magics
google.cloud.bigquery.magics.context.use_bqstorage_api = True
효율적인 저장 포맷 선택하기
스캔 크기를 줄이기 위해 테이블 파티셔닝하기
SELECT
start_station_name
, AVG(duration) AS avg_duration
FROM `bigquery-public-data`.london_bicycles.cycle_hire
WHERE EXTRACT(YEAR FROM start_date) = 2015
GROUP BY start_station_name
ORDER BY avg_duration DESC
LIMIT 5
CREATE OR REPLACE TABLE test AS (
SELECT * FROM `bigquery-public-data`.london_bicycles.cycle_hire
WHERE EXTRACT(YEAR FROM start_date) = 2015
)
- 1년치의 데이터만 활용해서 테이블을 새로 만듬
SELECT
start_station_name
, AVG(duration) AS avg_duration
FROM ch07eu.cycle_hire_2015
GROUP BY start_station_name
ORDER BY avg_duration DESC
LIMIT 5
SELECT
start_station_name
, AVG(duration) AS avg_duration
FROM `ch07eu.cycle_hire_*`
WHERE _TABLE_SUFFIX BETWEEN '2015' AND '2016'
GROUP BY start_station_name
ORDER BY avg_duration DESC
LIMIT 5
파티션을 나눈 테이블을 사용하면 모든 관련 데이터를 단일 논리 테이블에 저장하면서도 해당 데이터의 하위 집합을 효율적으로 쿼리할 수 있다.
예를 들어 지난 해 데이터의 전체를 저장하고 있지만, 대부분 지난주의 데이터만 쿼리하는 경우, 데이터를 시간별로 분할하면 지난 7일 분량의 파티션만 스캔해야 하는 쿼리를 실행할 수 있다. 이렇게 하면 쿼리 비용, 슬록 활용도 및 시간 면에서 비용을 절감할 수 있다.
파티션을 나눈 테이블은 빅쿼리가 관리하는 파티션으로 분할된 특별 테이블이다. 다음을 사용해 런던 cycle_hire 데이터 셋의 파티션 버전을 생성할 수 있다.
CREATE OR REPLACE TABLE ch07eu.cycle_hire_partitioned
PARTITION BY DATE(start_date) AS
SELECT * FROM `bigquery-public-data`.london_bicycles.cycle_hire
SELECT
start_station_name
, AVG(duration) AS avg_duration
FROM ch07eu.cycle_hire_partitioned
WHERE start_date BETWEEN '2015-01-01' AND '2015-12-31'
GROUP BY start_station_name
ORDER BY avg_duration DESC
LIMIT 5
-- 위의 쿼리는 start_date 컬럼을 읽어야 하므로 연도별로 샤딩한 테이블보다 조금 더 많은 데이터를 처리한다.
SELECT
start_station_name
, AVG(duration) AS avg_duration
FROM ch07eu.cycle_hire_partitioned
WHERE EXTRACT(YEAR FROM start_date) = 2015
GROUP BY start_station_name
ORDER BY avg_duration DESC
LIMIT 5
-- 이와 같은 구성은 단점이 존재한다. 처리해야할 데이터가 늘어나 절감 효과가 없다.
-- 파티셔닝의 이점을 얻으러면 빅쿼리 런타임이 파티션 필터를 정적으로 판별할 수 있어야 한다.
높은 카디널리티 키에 기반한 클러스터링 테이블
(카디널리티란 카디널리티는 전체 행에 대한 특정 컬럼의 중복 수치를 나타내는 지표이다.)
-- 클러스터링된 테이블을 생성하는 쿼리
CREATE OR REPLACE TABLE ch07eu.cycle_hire_clustered
PARTITION BY DATE(start_date)
CLUSTER BY start_station_name, end_station_name
AS (
SELECT * FROM `bigquery-public-data`.london_bicycles.cycle_hire
)
파티션을 나눈 테이블을 날짜 컬럼이나 수집 시간을 기준으로 날짜별로 파티션된다. 시(hour)를 기준으로 분할해야 한다면, 사용할 수 있는 방법은 날짜를 기준으로 파티셔닝한 다음 적절한 다른 속성과 함께 시별로 클러스터링하는 것이다.
따라서 일반적인 패턴은 파티션 기준과 동일한 컬럼을 기준으로 클러스터링 하는 것이다. 예를 들어 로그 이벤트가 발생하는 타임스탬프인 event_time 컬럼으로 파티션을 나누면 파티셔닝에 사용된 날짜 경계보다 작은 임의의 기간에 대해 매우 빠르고 효율적인 쿼리를 수행할 수 있다. 예전대, 10분 동안의 데이터만 쿼리하며 그보다 오래된 데이터는 스캔할 필요 없다.