TSV만 CSV로 바꾸면 됩니다.
이 가이드를 진행하면서 다음 작업을 수행합니다:
- 조사: TSV 파일의 구조와 내용을 쿼리합니다.
- 대상 ClickHouse 스키마 결정: 적절한 데이터 타입을 선택하고 기존 데이터를 해당 타입에 매핑합니다.
- ClickHouse 테이블 생성.
- 데이터 전처리 및 스트리밍을 통해 ClickHouse로 전송합니다.
- 몇 가지 쿼리 실행: ClickHouse에서 쿼리를 실행합니다.
사전 준비 사항
- NYPD Complaint Data Current (Year To Date) 페이지로 이동한 다음 Export 버튼을 클릭하고 TSV for Excel을 선택하여 데이터셋을 다운로드합니다.
- ClickHouse 서버 및 클라이언트를 설치합니다
이 가이드에서 설명하는 명령에 대한 참고 사항
- 일부 명령은 TSV 파일에 쿼리하는 명령이며, 명령 프롬프트에서 실행합니다.
- 나머지 명령은 ClickHouse에 쿼리하는 명령이며,
clickhouse-client또는 Play UI에서 실행합니다.
이 가이드의 예시는 TSV 파일이
${HOME}/NYPD_Complaint_Data_Current__Year_To_Date_.tsv에 저장되어 있다고 가정합니다. 필요에 따라 명령을 조정하십시오.TSV 파일 살펴보기
원본 TSV 파일의 필드 살펴보기
Query
clickhouse-local을 사용합니다.
Query
Response
Nullable(Float64)로 설정되어 있고 그 외의 모든 필드는 Nullable(String)입니다. 데이터를 저장할 ClickHouse 테이블을 만들 때는 더 적절하고 성능에 유리한 타입을 지정할 수 있습니다.
적절한 스키마 결정
JURISDICTION_CODE 필드는 숫자형입니다. UInt8을 사용해야 할까요, Enum을 사용해야 할까요, 아니면 Float64가 적절할까요?
Query
Response
JURISDICTION_CODE는 UInt8에 잘 맞는다는 것을 알 수 있습니다.
마찬가지로 일부 String 필드도 살펴보고, DateTime 또는 LowCardinality(String) 필드로 사용하기에 적합한지 확인합니다.
예를 들어 PARKS_NM 필드는 “해당하는 경우 사건 발생 장소인 뉴욕시 공원, 놀이터 또는 녹지의 이름(주립공원 제외)“으로 설명됩니다. 뉴욕시 공원 이름은 LowCardinality(String)의 좋은 후보가 될 수 있습니다:
Query
Response
Query
Response
PARK_NM 컬럼에 서로 다른 공원과 놀이터가 수백 개 정도밖에 없습니다. 이는 LowCardinality(String) 필드에서는 고유한 문자열 수를 10,000개 미만으로 유지하라는 LowCardinality 권장 사항을 고려하면 적은 수입니다.
DateTime 필드
CMPLNT_FR_DT 및 CMPLT_TO_DT의 최솟값과 최댓값을 확인하면 해당 필드가 항상 채워지는지 여부를 가늠할 수 있습니다:
Query
Response
Query
Response
Query
Response
Query
Response
계획 세우기
JURISDICTION_CODE는UInt8로 CAST해야 합니다.PARKS_NM은LowCardinality(String)으로 CAST해야 합니다.CMPLNT_FR_DT와CMPLNT_FR_TM은 항상 값이 있습니다(00:00:00기본 시간이 들어갈 수도 있음).CMPLNT_TO_DT와CMPLNT_TO_TM은 비어 있을 수 있습니다.- 원본에서는 날짜와 시간이 별도의 필드에 저장됩니다.
- 날짜는
mm/dd/yyyy포맷입니다. - 시간은
hh:mm:ss포맷입니다. - 날짜와 시간을 연결해 DateTime 타입으로 만들 수 있습니다.
- 1970년 1월 1일 이전 날짜도 일부 있으므로 64비트 DateTime이 필요합니다.
타입에 적용해야 할 변경 사항은 이보다 훨씬 많지만, 모두 동일한 조사 단계에 따라 결정할 수 있습니다. 필드에 있는 고유 문자열 수와 숫자값의 최솟값 및 최댓값을 살펴보고 판단하십시오. 이 가이드 뒤쪽에 제시된 테이블 스키마에는 낮은 카디널리티 문자열과 부호 없는 정수 필드가 많고, 부동소수점 숫자 필드는 매우 적습니다.
날짜 및 시간 필드 연결하기
CMPLNT_FR_DT와 CMPLNT_FR_TM을 연결해 DateTime으로 CAST할 수 있는 단일 String으로 만들려면, 연결 연산자로 두 필드를 이어 붙인 CMPLNT_FR_DT || ' ' || CMPLNT_FR_TM를 선택합니다. CMPLNT_TO_DT와 CMPLNT_TO_TM 필드도 같은 방식으로 처리합니다.
Query
Response
날짜 및 시간 String을 DateTime64 타입으로 변환
MM/DD/YYYY에서 YYYY/MM/DD로 변환해야 합니다. 이 두 작업은 모두 parseDateTime64BestEffort()를 사용해 수행할 수 있습니다.
Query
DateTime64로 파싱합니다. 불만 종료 시간은 항상 존재하는 것이 아니므로 parseDateTime64BestEffortOrNull을 사용합니다.
Response
위에
1925로 표시된 날짜는 데이터 오류로 인한 것입니다. 원본 데이터에는 1019 - 1022년으로 되어 있지만 실제로는 2019 - 2022년이어야 하는 레코드가 여러 개 있습니다. 64 bit DateTime에서 표현할 수 있는 가장 이른 날짜가 1925년 1월 1일이기 때문에 해당 값으로 저장됩니다.테이블 생성
ORDER BY와 PRIMARY KEY도 결정해야 합니다. ORDER BY 또는 PRIMARY KEY 중 하나 이상은 반드시 지정해야 합니다. 아래에는 ORDER BY에 포함할 컬럼을 결정할 때 참고할 몇 가지 지침을 정리했습니다. 자세한 내용은 이 문서 끝의 다음 단계 섹션에서 확인할 수 있습니다.
ORDER BY 및 PRIMARY KEY 절
ORDER BY튜플에는 쿼리 필터에 사용되는 필드가 포함되어야 합니다- 디스크 압축을 최대화하려면
ORDER BY튜플을 카디널리티가 낮은 순서대로 정렬해야 합니다 PRIMARY KEY튜플이 있으면ORDER BY튜플의 부분 집합이어야 합니다ORDER BY만 지정하면 동일한 튜플이PRIMARY KEY로 사용됩니다- 프라이머리 키 인덱스는 지정된 경우
PRIMARY KEY튜플을 사용하고, 그렇지 않으면ORDER BY튜플을 사용해 생성됩니다 PRIMARY KEY인덱스는 메인 메모리에 유지됩니다
ORDER BY에 포함할 수 있습니다:
후보 컬럼 3개의 카디널리티를 확인하기 위해 TSV 파일을 쿼리합니다:
Query
Response
ORDER BY는 다음과 같습니다:
아래 표에서는 가독성이 더 높은 컬럼 이름을 사용하며, 위의 이름은 다음과 같이 매핑됩니다.
ORDER BY 튜플을 함께 반영하면 다음과 같은 테이블 구조가 됩니다:
테이블의 기본 키 찾기
system 데이터베이스, 특히 system.table에는 방금 생성한 테이블의 모든 정보가 들어 있습니다. 이 쿼리는 ORDER BY(정렬 키)와 PRIMARY KEY를 보여줍니다:
데이터 전처리 및 가져오기
clickhouse-local 도구를 사용하고, 업로드에는 clickhouse-client를 사용합니다.
사용된 clickhouse-local 인수
데이터 확인
데이터셋은 매년 한 번 이상 변경되므로, 집계 건수가 이 문서에 있는 값과 일치하지 않을 수 있습니다.
Query
Response
Query
Response
몇 가지 쿼리 실행
쿼리 1. 월별 민원 건수 비교
Query
Response
쿼리 2. 자치구별 총 민원 건수 비교
Query
Response