고급 튜토리얼
개요
New York City 택시 예제 데이터셋을 사용하여 ClickHouse에서 데이터를 수집하고 쿼리하는 방법을 알아봅니다.
Prerequisites
이 튜토리얼을 완료하려면 실행 중인 ClickHouse 서비스에 대한 접근 권한이 있어야 합니다. 자세한 내용은 빠른 시작 가이드를 참조하십시오.
새 테이블 생성하기
뉴욕시 택시 데이터셋은 수백만 건의 택시 운행에 대한 세부 정보를 포함하며, 팁 금액, 통행료, 결제 유형 등의 컬럼이 포함되어 있습니다. 이 데이터를 저장할 테이블을 생성하세요.
-
SQL 콘솔에 연결하십시오:
- ClickHouse Cloud의 경우 드롭다운 메뉴에서 서비스를 선택한 다음 왼쪽 탐색 메뉴에서 SQL Console을 선택합니다.
- 자가 관리형 ClickHouse의 경우
https://_hostname_:8443/play의 SQL 콘솔에 접속합니다. 자세한 접속 정보는 ClickHouse 관리자에게 문의하십시오.
-
default데이터베이스에 다음과 같은trips테이블을 생성합니다:
데이터셋 추가하기
테이블을 생성했으므로, S3의 CSV 파일에서 뉴욕시 택시 데이터를 추가하세요.
-
다음 명령어는 S3에 있는 두 개의 파일
trips_1.tsv.gz및trips_2.tsv.gz에서trips테이블로 약 2,000,000개의 행을 삽입합니다: -
INSERT가 완료될 때까지 기다리십시오. 150 MB 용량의 데이터를 다운로드하는 데 잠시 시간이 걸릴 수 있습니다. -
INSERT가 완료되면 정상적으로 완료되었는지 확인합니다:
이 쿼리를 실행하면 1,999,657개의 행이 반환되어야 합니다.
데이터 분석하기
데이터를 분석하기 위해 몇 가지 쿼리를 실행하세요. 다음 예제를 살펴보거나 직접 SQL 쿼리를 작성해 보세요.
-
평균 팁 금액 계산:
예상 출력
-
승객 수를 기준으로 평균 비용을 계산하십시오:
예상 출력
passenger_count값은 0부터 9까지입니다: -
지역별 일일 픽업 건수를 계산하십시오:
예상 결과
-
각 여행의 소요 시간을 분 단위로 계산한 다음, 결과를 소요 시간(분)별로 그룹화합니다.
예상 출력
-
동네별로 하루 중 각 시간대별 픽업 건수를 표시합니다:
예상 출력 결과
-
LaGuardia 또는 JFK 공항행 승차 기록을 조회하십시오:
예상 출력
딕셔너리 생성하기
딕셔너리는 메모리에 저장된 key-value 쌍의 매핑입니다. 자세한 내용은 딕셔너리를 참조하세요.
ClickHouse 서비스의 테이블과 연결된 딕셔너리를 생성하세요. 테이블과 딕셔너리는 뉴욕시의 각 지역별로 하나의 행을 포함하는 CSV 파일을 기반으로 합니다.
neighborhoods는 뉴욕시의 5개 자치구(Bronx, Brooklyn, Manhattan, Queens, Staten Island) 이름 및 Newark 공항(EWR)에 매핑됩니다.
다음은 사용 중인 CSV 파일의 일부를 테이블 형식으로 나타낸 것입니다. 파일의 LocationID 컬럼은 trips 테이블의 pickup_nyct2010_gid 및 dropoff_nyct2010_gid 컬럼에 매핑됩니다:
| LocationID | 행정 구역 | 세부 지역 | 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 |
- 다음 SQL 명령을 실행하십시오. 이 명령은
taxi_zone_dictionary라는 이름의 딕셔너리를 생성하고, S3에 있는 CSV 파일에서 해당 딕셔너리를 채웁니다. 파일 URL은https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/taxi_zone_lookup.csv입니다.
LIFETIME을 0으로 설정하면 자동 업데이트가 비활성화되어 S3 버킷으로의 불필요한 트래픽을 방지합니다. 다른 경우에는 다르게 구성할 수 있습니다. 자세한 내용은 LIFETIME을 사용하여 딕셔너리 데이터 새로고침을 참조하십시오.
-
올바르게 동작하는지 확인합니다. 다음 쿼리는 265개의 행, 즉 각 동네마다 하나의 행을 반환해야 합니다.
-
딕셔너리에서 값을 조회하려면
dictGet함수(또는 그 변형 함수)를 사용합니다. 딕셔너리 이름, 조회하려는 값의 컬럼 이름, 그리고 키(이 예제에서는taxi_zone_dictionary의LocationID컬럼)를 인수로 전달합니다.예를 들어, 다음 쿼리는
LocationID가 132인Borough를 반환하며, 이는 JFK 공항에 해당합니다.JFK는 퀸즈에 있습니다. 값을 조회하는 데 걸리는 시간은 사실상 0초임을 알 수 있습니다:
-
dictHas함수를 사용하여 키가 딕셔너리에 존재하는지 확인합니다. 예를 들어, 다음 쿼리는1을 반환하며, 이는 ClickHouse에서 「true」를 의미합니다. -
다음 쿼리는 딕셔너리에서
LocationID에 4567 값이 없으므로 0을 반환합니다. -
dictGet함수를 사용하여 쿼리에서 borough의 이름을 조회합니다. 예를 들어:이 쿼리는 LaGuardia 또는 JFK 공항에서 끝나는 택시 운행 횟수를 자치구별로 합산합니다. 결과는 다음과 같으며, 승차 지역(pickup neighborhood)이 알려지지 않은 운행이 상당히 많다는 점을 확인할 수 있습니다.
조인 수행
taxi_zone_dictionary와 trips 테이블을 조인하는 쿼리를 작성하세요.
-
먼저 앞에서 살펴본 공항 쿼리와 비슷하게 동작하는 간단한
JOIN부터 시작합니다:응답은
dictGet쿼리의 결과와 동일해 보입니다.참고위의
JOIN쿼리 출력 결과는dictGetOrDefault를 사용했던 이전 쿼리와 동일합니다. 단,Unknown값은 포함되지 않습니다. 내부적으로는 ClickHouse가taxi_zone_dictionary딕셔너리에 대해dictGet함수를 호출하지만,JOIN구문이 SQL 개발자에게는 더 익숙합니다. -
이 쿼리는 가장 높은 팁 금액을 가진 1000개의 여행에 대한 행을 반환한 다음, 각 행을 딕셔너리와 내부 조인합니다:
참고일반적으로 ClickHouse에서는
SELECT *를 자주 사용하지 않는 것이 좋습니다. 실제로 필요한 컬럼만 조회해야 합니다.
다음 단계
다음 문서를 통해 ClickHouse에 대해 더 자세히 알아보십시오.
- ClickHouse의 프라이머리 인덱스 소개: ClickHouse가 희소 프라이머리 인덱스를 사용하여 쿼리 시 관련 데이터를 효율적으로 찾는 방법을 살펴봅니다.
- 외부 데이터 소스 통합: 파일, Kafka, PostgreSQL, 데이터 파이프라인 등 다양한 데이터 소스 통합 옵션을 검토합니다.
- ClickHouse에서 데이터 시각화: 선호하는 UI/BI 도구를 ClickHouse에 연결합니다.
- SQL Reference: 데이터를 변환, 처리 및 분석하기 위해 ClickHouse에서 사용할 수 있는 SQL 함수를 살펴봅니다.