pg_clickhouse 튜토리얼
개요
이 튜토리얼은 [ClickHouse 튜토리얼]을 기반으로 하되, 모든 쿼리는 pg_clickhouse를 통해 실행합니다.
ClickHouse 시작하기
먼저 ClickHouse 데이터베이스가 없다면 생성합니다. 빠르게 시작하려면 Docker 이미지를 사용하는 것이 좋습니다:
테이블 생성하기
[ClickHouse tutorial]을 참고하여 뉴욕시 택시 데이터셋으로 간단한 데이터베이스를 만들어 보겠습니다:
데이터 Set 추가
그다음 데이터를 가져옵니다:
쿼리를 실행할 수 있는지 확인한 다음 클라이언트를 종료하십시오:
pg_clickhouse 설치
PGXN 또는 GitHub에서 pg_clickhouse를 빌드하고 설치합니다. 또는 [pg_clickhouse image]를 사용하여 Docker 컨테이너를 실행할 수 있습니다. 이 이미지는 Docker Postgres image에 pg_clickhouse만 단순히 추가한 것입니다.
pg_clickhouse 연결
이제 Postgres에 연결하십시오:
그리고 pg_clickhouse를 생성합니다:
ClickHouse 데이터베이스의 호스트 이름, 포트, 데이터베이스 이름을 사용하여 foreign server를 생성합니다.
여기서는 ClickHouse 바이너리 프로토콜을 사용하는 binary 드라이버를 선택했습니다. HTTP 인터페이스를 사용하는 "http" 드라이버를 사용할 수도 있습니다.
다음으로 PostgreSQL 사용자와 ClickHouse 사용자를 매핑합니다. 가장 간단한 방법은 현재 PostgreSQL 사용자를 외부 서버의 원격 사용자에 그대로 매핑하는 것입니다:
password 옵션도 지정할 수 있습니다.
이제 taxi 테이블을 추가합니다. 이를 위해 원격 ClickHouse 데이터베이스에 있는 모든 테이블을 Postgres 스키마로 가져오십시오.
이제 테이블이 가져와졌을 것입니다. psql에서 \det+를 사용하여 확인하십시오:
성공했습니다! 모든 컬럼을 보려면 \d를 사용하십시오:
이제 테이블에 쿼리를 실행하십시오:
쿼리가 얼마나 빠르게 실행되었는지에 주목하십시오. pg_clickhouse는 COUNT() 집계를 포함한 전체
쿼리를 ClickHouse로 푸시다운하여 ClickHouse에서 실행한 뒤 단일 행만 Postgres로
반환합니다. EXPLAIN을 사용하여 이를 확인하십시오.
실행 계획의 루트에 「Foreign Scan」이 나타난 것은 전체 쿼리가 ClickHouse로 푸시다운되었음을 의미합니다.
데이터 분석
데이터를 분석하기 위해 몇 가지 쿼리를 실행하십시오. 다음 예시를 살펴보거나 직접 SQL 쿼리를 실행해 보십시오.
-
평균 팁 금액을 계산하십시오:
-
승객 수를 기준으로 평균 요금을 계산합니다:
-
지역별 일별 픽업 건수를 계산합니다:
-
각 운행의 소요 시간을 분 단위로 계산한 다음, 소요 시간별로 결과를 그룹화합니다:
-
각 동네별로 하루 중 시(hour) 단위로 나눈 픽업 횟수를 표시합니다:
-
LaGuardia 또는 JFK 공항행 택시 운행을 조회합니다:
딕셔너리(Dictionary) 생성
ClickHouse 서비스의 테이블과 연관된 딕셔너리를 생성합니다.
이 테이블과 딕셔너리는 뉴욕시 각 동네별로 한 행씩을 포함하는 CSV 파일을 기반으로 합니다.
각 동네는 뉴욕시 5개 자치구(Bronx, Brooklyn, Manhattan, Queens, Staten Island)와 Newark Airport(EWR)에 매핑됩니다.
아래는 사용하는 CSV 파일의 일부를 테이블 형식으로 나타낸 것입니다.
파일의 LocationID 컬럼은 trips 테이블의 pickup_nyct2010_gid 및
dropoff_nyct2010_gid 컬럼에 매핑됩니다:
| LocationID | Borough | Zone | service_zone |
|---|---|---|---|
| 1 | EWR | Newark Airport | EWR |
| 2 | Queens | Jamaica Bay | Boro Zone |
| 3 | Bronx | Allerton/Pelham Gardens | Boro Zone |
| 4 | Manhattan | Alphabet City | Yellow Zone |
| 5 | Staten Island | Arden Heights | Boro Zone |
-
Postgres에서 계속해서
clickhouse_raw_query함수를 사용하여 ClickHouse dictionarytaxi_zone_dictionary를 생성하고, S3에 있는 CSV 파일에서 딕셔너리를 채웁니다:참고LIFETIME을 0으로 설정하면 자동 업데이트가 비활성화되어 S3 버킷으로의 불필요한 트래픽을 방지합니다.
다른 상황에서는 이 값을 다르게 구성할 수 있습니다. 자세한 내용은 LIFETIME을 사용한 딕셔너리 데이터 새로 고침을 참고하십시오.- 이제 이를 가져옵니다:
- 쿼리할 수 있는지 확인합니다:
- 이제
dictGet함수를 사용하여 쿼리에서 자치구 이름을 가져옵니다. 이 쿼리는 LaGuardia 또는 JFK 공항에서 끝나는 택시 탑승 건수를 자치구별로 합산합니다:
이 쿼리는 LaGuardia 또는 JFK 공항에서 끝나는 택시 탑승 건수를 자치구별로 합산합니다. 픽업 지역이 알 수 없는 경우가 상당히 많다는 점에 주목하십시오.
조인 수행하기
taxi_zone_dictionary를 trips 테이블과 조인하는 몇 가지 쿼리를 작성합니다.
-
앞에서 본 공항 관련 쿼리와 유사하게 동작하는 간단한
JOIN부터 시작합니다:참고위
JOIN쿼리의 출력은Unknown값이 포함되지 않은 점을 제외하면 앞의dictGet쿼리와 동일합니다. 내부적으로 ClickHouse는taxi_zone_dictionary딕셔너리에 대해dictGet함수를 호출하지만,JOIN구문이 SQL 개발자에게 더 익숙합니다. -
이 쿼리는 팁 금액이 가장 높은 1,000개의 운행에 대한 행을 반환한 다음, 각 행을 딕셔너리와 내부 조인을 수행합니다:
일반적으로 PostgreSQL과 ClickHouse에서는 SELECT * 사용을 피합니다. 실제로 필요한 컬럼만 조회해야 합니다.