이 튜토리얼에서는 CSV 및 Parquet 포맷의 Hacker News 데이터 2,800만 행을 ClickHouse 테이블에 삽입하고, 몇 가지 간단한 쿼리를 실행해 데이터를 살펴봅니다.
CSV
1
CSV 다운로드
데이터셋의 CSV 버전은 공개 S3 버킷에서 다운로드하거나, 다음 명령을 실행해 다운로드할 수 있습니다:4.6GB, 2,800만 행 규모의 이 압축 파일은 다운로드에 5~10분 정도 소요됩니다.
2
데이터 샘플링
clickhouse-local을 사용하면
ClickHouse 서버를 배포하거나 구성하지 않고도 로컬 파일을 빠르게 처리할 수 있습니다.ClickHouse에 데이터를 저장하기 전에 clickhouse-local로 파일을 샘플링해 보겠습니다.
콘솔에서 다음을 실행하십시오:Query
Response
file 연산자를 사용하면 포맷으로 CSVWithNames만 지정하여 로컬 디스크의 파일을 읽을 수 있습니다.
가장 중요한 점은 파일 내용에서 스키마가 자동으로 추론된다는 것입니다.
또한 clickhouse-local이 확장자를 바탕으로 gzip 포맷을 추론해 압축된 파일을 읽을 수 있다는 점에도 주목하십시오.
Vertical 포맷을 사용하면 각 컬럼의 데이터를 더 쉽게 확인할 수 있습니다.3
스키마 추론으로 데이터 로드하기
데이터를 로드하는 가장 간단하면서도 강력한 도구는 이렇게 하면 데이터에서 자동으로 추론된 스키마를 사용해 빈 테이블을 생성합니다.
이 테이블에 데이터를 삽입하려면 명령 한 번으로 ClickHouse에 2,800만 개의 행을 성공적으로 삽입했습니다!
clickhouse-client입니다. 기능이 풍부한 네이티브 command-line client입니다.
데이터를 로드할 때도 스키마 추론을 활용할 수 있으며, 컬럼의 타입은 ClickHouse가 결정합니다.url 함수를 통해 원격 CSV 파일의 내용에 접근하여 테이블을 생성하고 데이터를 직접 삽입하려면, 다음 명령을 실행하세요.
스키마는 자동으로 추론됩니다:DESCRIBE TABLE 명령을 사용하면 할당된 타입을 확인할 수 있습니다.Query
Response
INSERT INTO, SELECT 명령을 사용하십시오.
url 함수와 함께 사용하면 URL에서 데이터를 직접 스트리밍할 수 있습니다:4
데이터 탐색하기
다음 쿼리를 실행하여 Hacker News 스토리와 특정 컬럼의 샘플을 확인합니다:스키마 추론은 초기 데이터 탐색에 매우 유용한 도구이지만, 「best effort」 방식이므로 데이터에 최적화된 스키마를 정의하는 것을 장기적으로 대체할 수는 없습니다.
Query
Response
5
스키마 정의
가장 명확하면서도 바로 적용할 수 있는 최적화 방법은 각 필드의 타입을 정의하는 것입니다.
시간 필드를 최적화된 스키마(schema)를 사용하면 이제 로컬 파일 시스템의 데이터를 삽입할 수 있습니다.
다시
DateTime 타입으로 선언하는 것과 함께, 기존 데이터셋을 삭제한 뒤 아래 각 필드에도 적절한 타입을 지정합니다.
ClickHouse에서는 데이터의 프라이머리 키 ID를 ORDER BY 절로 정의합니다.적절한 타입을 선택하고 ORDER BY
절에 포함할 컬럼을 결정하면 쿼리 속도와 압축 효율을 높이는 데 도움이 됩니다.아래 쿼리를 실행하여 기존 스키마를 삭제하고 개선된 스키마를 생성하세요:Query
clickhouse-client를 사용해, 명시적으로 INSERT INTO를 지정하고 INFILE 절로 파일의 데이터를 삽입합니다.Query
6
샘플 쿼리 실행
아래에 몇 가지 샘플 쿼리를 제공합니다. 직접 쿼리를 작성할 때 참고하시기 바랍니다.ClickHouse가 시간이 지남에 따라 노이즈가 증가하고 있습니까? 여기서 “ClickHouse”는 시간이 지날수록 인기가 높아지고 있는 것으로 보입니다.
Hacker News에서 “ClickHouse”는 얼마나 자주 언급되는 주제입니까?
score 필드는 스토리의 인기도를 나타내는 메트릭을 제공하며,id 필드와 ||
연결 연산자를 활용하면 원본 게시물의 링크를 생성할 수 있습니다.Query
Response
time 필드를 DateTime으로 정의하는 것의 유용성을 확인할 수 있습니다. 적절한 데이터 타입을 사용하면 toYYYYMM() 함수를 활용할 수 있습니다:Query
Response
ClickHouse 관련 기사에서 댓글을 가장 많이 작성한 사용자는 누구인가요?
Query
Response
어떤 댓글이 가장 많은 관심을 받습니까?
Query
Response
Parquet
1
데이터 삽입
다음 쿼리를 실행하여 다음 명령을 실행하여 추론된 스키마를 확인하십시오:이후 단계에서는
url 함수로 원격 데이터를 다시 읽되, 이번에는 Parquet 포맷으로 읽습니다:Parquet의 NULL 키추론된 스키마에서는 컬럼이
Nullable로 지정되므로, 이 데이터셋에
NULL ID가 없더라도 allow_nullable_key가 필요합니다.Query
Response
author, comment 등 더 명확한 컬럼명을 사용하므로, 수동으로 지정한 스키마를 사용합니다.
먼저 추론된 테이블을 삭제한 후 테이블을 생성하고, 공개 S3 버킷에서 직접 데이터를 삽입합니다:2
검색 속도를 높이기 위한 텍스트 인덱스 추가
“ClickHouse”를 언급한 댓글 수를 확인하려면 다음 쿼리를 실행하십시오.다음으로, 이 쿼리의 속도를 높이기 위해 머티리얼라이즈하면 기존 데이터의 인덱스가 생성됩니다. 결과는 동일합니다. 인덱스는 일치하는 행이 무엇인지가 아니라 ClickHouse가 일치하는 행을 찾는 방식을 변경하기 때문입니다. 인덱스가 적용된
쿼리는 훨씬 적은 데이터를 처리하므로 훨씬 빠르게 완료됩니다.
모든 토큰이 순서와 관계없이 일치해야 할 때는
Query
Response
comment 컬럼에 텍스트 인덱스를 생성합니다.
텍스트 인덱스는 토큰과 해당 토큰이 포함된 행을 매핑하는 역색인을 사용합니다.
splitByNonAlpha 토크나이저는 영숫자가 아닌 문자를 기준으로 텍스트를 분할합니다. 인덱스와 쿼리에서는 소문자 검색어와 함께 lower(comment)를 사용하므로 대소문자를 구분하지 않고 일치시킬 수 있습니다. 쿼리 표현식은 인덱싱된 표현식과 일치해야 합니다.다음 명령어를 실행하여 인덱스를 생성합니다:mutations_sync 설정을 사용하면 머티리얼라이즈가 완료될 때까지 대기합니다.
system.data_skipping_indices 테이블에서 인덱스 정의를 확인할 수 있습니다.인덱스가 구체화된 후 동일한 쿼리를 다시 실행합니다:Query
Response
EXPLAIN을 사용하여 ClickHouse가 인덱스를 적용하도록 계획하는지 확인하십시오:Query
Response
comment_idx 항목은 ClickHouse가 텍스트 인덱스를 적용할 계획임을 보여줍니다. 이 예시에서 계획은 3527개의
그래뉼 중 547개만 선택하므로 검사할 데이터 양이 크게 줄어듭니다.여러 토큰 중 하나 이상 또는 모든 토큰을 검색할 수도 있습니다. 이러한 함수는 인덱스 토크나이저가 생성한 완전한 토큰과 일치합니다.
하나 이상의 토큰이 일치해야 하면 hasAnyTokens를 사용하세요:Query
Response
hasAllTokens를 사용합니다:Query
Response