Skip to main content
Foursquare OS Places에는 상점, 레스토랑, 공원, 놀이터, 기념물 등 1억 개가 넘는 상업 시설 관심 지점(POI)이 포함되어 있습니다. 이 가이드에서는 ClickHouse를 Foursquare의 Iceberg 카탈로그에 연결하고, 데이터셋을 살펴본 다음 지리 공간 쿼리에 최적화된 테이블로 로드합니다. 데이터셋은 Foursquare Places Portal에서 제공되며, Apache 2.0 라이선스에 따라 무료로 사용할 수 있습니다.
Foursquare는 OS Places 액세스 방식을 변경했습니다. 이 가이드의 이전 버전에서는 공개 S3 버킷에 있는 날짜별 고정 파일을 쿼리했지만, 이제는 Places Portal과 인증된 Iceberg 카탈로그를 통해 액세스합니다. 자세한 내용은 Foursquare의 OS Places 액세스 문서를 참조하십시오.

시작하기 전에

이 가이드의 쿼리를 실행하기 전에 다음이 필요합니다.

Foursquare 카탈로그에 연결

액세스 토큰을 안전하게 보관하십시오. ClickHouse 클라이언트를 시작한 다음, 다음 쿼리에서 <YOUR_ACCESS_TOKEN>을 액세스 토큰으로 대체하십시오:
Query
카탈로그 데이터베이스는 읽기 전용입니다. places_os 테이블은 날짜가 고정된 Parquet 릴리스가 아니라 Foursquare’s 현재 게시 릴리스를 반영하므로, 행과 스키마가 시간이 지남에 따라 변경될 수 있습니다. 따라서 ORDER BY 절이 없는 쿼리는 이 가이드에 표시된 응답과 다른 샘플 행을 반환할 수 있습니다.

연결 확인

places_os Iceberg 테이블에서 행 1개를 쿼리합니다:
Query
Response

데이터 탐색

샘플 행에는 여러 null 필드가 있습니다. 더 완전한 행을 반환하도록 필터를 추가하세요:
Query
Response
DESCRIBE를 사용하여 테이블 스키마를 확인하세요:
Query
Response

ClickHouse에 데이터 로드

데이터를 영구적으로 저장하려면 clickhouse-server 또는 ClickHouse Cloud에 테이블을 생성합니다. 딕셔너리로 인코딩된 컬럼과 구체화된 Web Mercator 좌표가 포함된 MergeTree 테이블을 생성합니다:
Query
여러 컬럼은 반복되는 값을 딕셔너리 인코딩으로 저장하는 LowCardinality 데이터 타입을 사용합니다. 이러한 표현 방식은 SELECT 쿼리 성능을 크게 향상시킬 수 있습니다. UInt32 MATERIALIZED 컬럼인 mercator_xmercator_y는 위도와 경도를 Web Mercator projection으로 매핑하여, 지도를 타일로 더 쉽게 분할할 수 있도록 합니다:
표현식은 다음 값을 계산합니다. mercator_x 이 컬럼은 경도 값을 메르카토르 투영법의 X 좌표로 변환합니다.
  • longitude + 180은 경도 범위를 [-180, 180]에서 [0, 360]으로 이동합니다.
  • 360으로 나누면 값이 0과 1 사이 범위로 정규화됩니다.
  • 최대 32비트 부호 없는 정수인 0xFFFFFFFF를 곱하면 정규화된 값이 32비트 정수의 전체 범위로 스케일링됩니다.
mercator_y 이 컬럼은 위도 값을 메르카토르 투영법의 Y 좌표로 변환합니다.
  • latitude + 90은 위도 범위를 [-90, 90]에서 [0, 180]으로 이동합니다.
  • 360으로 나눈 뒤 pi를 곱하면 값이 삼각 함수에 사용할 라디안으로 변환됩니다.
  • log(tan(...))은 메르카토르 투영법의 핵심 공식을 적용합니다.
  • 0xFFFFFFFF를 곱하면 결과가 32비트 정수의 전체 범위로 스케일링됩니다.
MATERIALIZED를 지정하면 원본 데이터에 컬럼이 없어도 데이터 삽입 시 ClickHouse가 이러한 값을 계산합니다. 테이블은 Z-순서 공간 충전 곡선을 생성하고 공간적 근접성에 따라 데이터를 구성하는 mortonEncode(mercator_x, mercator_y)를 기준으로 정렬됩니다.
두 개의 minmax 인덱스는 공간 필터링을 더욱 가속합니다:
현재 OS Places 릴리스를 테이블로 로드합니다:
이 쿼리는 1억 개가 넘는 행을 읽어 저장합니다. 상당한 시간이 소요되고 스토리지를 사용하며 ClickHouse Cloud 사용 비용이 발생할 수 있습니다. 다시 실행하면 동일한 데이터가 추가되므로, 가져오기를 재시도하기 전에 foursquare_mercator가 비어 있는지 확인하십시오.
Query
명시적으로 지정한 소스 및 대상 컬럼 목록은 카탈로그의 컬럼 순서가 변경되더라도 가져온 값이 잘못 매핑되는 것을 방지합니다. 이 쿼리는 로컬 테이블에 필요하지 않은 unresolved_flags를 제외하고, 좌표가 없는 행은 지도에 표시할 수 없으므로 필터링합니다. 널 허용 소스 값은 로컬 테이블에서도 null로 유지됩니다.

데이터 시각화

이 시각화가 생성된 이후 Foursquare의 접근 모델이 변경되었습니다. 기존 대화형 Places 보기는 현재 접근 모델이 도입되기 전에 만들어졌으며, 역사적 참고용으로 연결되어 있지만 더 이상 Places 데이터를 표시하지 않을 수 있습니다. 아래 이미지는 역사적 예시로 유지됩니다.
사내 해커톤에서 ClickHouse 공동 창립자이자 CTO인 Alexey Milovidov는 ClickHouse를 사용하여 Foursquare 데이터셋에서 다음 시각화를 만들었습니다.
마지막 수정일 2026년 8월 14일