Parquet 데이터 다루기
Parquet 데이터 다루기
Parquet은 데이터를 컬럼 지향 방식으로 저장하는 효율적인 파일 포맷이에요. ClickHouse는 Parquet 파일 읽기와 쓰기를 모두 지원한답니다.
출처: 문서
본문
쿼리에서 파일 경로를 참조하면 ClickHouse가 읽으려는 위치는 사용하는 ClickHouse 변형에 따라 달라져요. clickhouse-local을 사용한다면 ClickHouse Local을 실행한 위치 기준으로 읽어요. ClickHouse Server 또는 ClickHouse Cloud를 clickhouse client로 사용한다면 서버의 /var/lib/clickhouse/user_files/ 디렉터리 기준으로 읽어요.
Parquet에서 가져오기
데이터를 적재하기 전에 file() 함수로 예시 parquet 파일 구조를 탐색할 수 있어요.
DESCRIBE TABLE file('data.parquet', Parquet);
두 번째 인자로 Parquet을 사용해서 ClickHouse가 파일 포맷을 알 수 있게 했어요. 이것은 타입과 함께 컬럼을 출력해요.
┌─name─┬─type─────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
│ path │ Nullable(String) │ │ │ │ │ │
│ date │ Nullable(String) │ │ │ │ │ │
│ hits │ Nullable(Int64) │ │ │ │ │ │
└──────┴──────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
SQL의 모든 힘을 사용해 실제로 가져오기 전에 파일을 탐색할 수도 있어요.
SELECT *
FROM file('data.parquet', Parquet)
LIMIT 3;
┌─path──────────────────────┬─date───────┬─hits─┐
│ Akiba_Hebrew_Academy │ 2017-08-01 │ 241 │
│ Aegithina_tiphia │ 2018-02-01 │ 34 │
│ 1971-72_Utah_Stars_season │ 2016-10-01 │ 1 │
└───────────────────────────┴────────────┴──────┘
file()과 INFILE/OUTFILE에는 명시적인 포맷 설정을 생략할 수 있어요. 이 경우 ClickHouse가 파일 확장자에 따라 포맷을 자동으로 감지해요.
기존 테이블로 가져오기
Parquet 데이터를 가져올 테이블을 만들어 볼게요.
CREATE TABLE sometable
(
`path` String,
`date` Date,
`hits` UInt32
)
ENGINE = MergeTree
ORDER BY (date, path);
이제 FROM INFILE 절로 데이터를 가져올 수 있어요.
INSERT INTO sometable
FROM INFILE 'data.parquet' FORMAT Parquet;
SELECT *
FROM sometable
LIMIT 5;
┌─path──────────────────────────┬───────date─┬─hits─┐
│ 1988_in_philosophy │ 2015-05-01 │ 70 │
│ 2004_Green_Bay_Packers_season │ 2015-05-01 │ 970 │
│ 24_hours_of_lemans │ 2015-05-01 │ 37 │
│ 25604_Karlin │ 2015-05-01 │ 20 │
│ ASCII_ART │ 2015-05-01 │ 9 │
└───────────────────────────────┴────────────┴──────┘
ClickHouse가 Parquet 문자열(date 컬럼)을 Date 타입으로 자동 변환한 걸 눈여겨보세요. ClickHouse는 대상 테이블의 타입을 바탕으로 자동으로 타입 변환을 하기 때문이에요.
로컬 파일을 원격 서버에 삽입하기
로컬 Parquet 파일을 원격 ClickHouse 서버에 삽입하려면 아래처럼 파일 내용을 clickhouse-client로 파이프하면 돼요.
clickhouse client -q "INSERT INTO sometable FORMAT Parquet" < data.parquet
Parquet 파일에서 새 테이블 만들기
ClickHouse는 parquet 파일 스키마를 읽으므로 테이블을 즉석에서 만들 수 있어요.
CREATE TABLE imported_from_parquet
ENGINE = MergeTree
ORDER BY tuple() AS
SELECT *
FROM file('data.parquet', Parquet)
이렇게 하면 주어진 parquet 파일에서 테이블을 자동으로 만들고 채워요.
DESCRIBE TABLE imported_from_parquet;
┌─name─┬─type─────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
│ path │ Nullable(String) │ │ │ │ │ │
│ date │ Nullable(String) │ │ │ │ │ │
│ hits │ Nullable(Int64) │ │ │ │ │ │
└──────┴──────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
기본적으로 ClickHouse는 컬럼 이름, 타입, 값에 대해 엄격해요. 하지만 때로는 가져오는 동안 존재하지 않는 컬럼이나 지원되지 않는 값을 건너뛸 수 있어요. 이것은 Parquet 설정으로 관리할 수 있어요.
Parquet 포맷으로 내보내기
ClickHouse Cloud에서 INTO OUTFILE을 사용할 때는 파일이 쓰여질 머신의 clickhouse client에서 명령을 실행해야 해요.
테이블이나 쿼리 결과를 Parquet 파일로 내보내려면 INTO OUTFILE 절을 쓸 수 있어요.
SELECT *
FROM sometable
INTO OUTFILE 'export.parquet'
FORMAT Parquet
이렇게 하면 작업 디렉터리에 export.parquet 파일이 생성돼요.
ClickHouse와 Parquet 데이터 타입
ClickHouse와 Parquet의 데이터 타입은 대부분 동일하지만 조금 다릅니다. 예를 들어 ClickHouse는 DateTime 타입을 Parquet의 int64로 내보내요. 다시 ClickHouse로 가져오면 숫자를 보게 돼요 (time.parquet 파일).
SELECT * FROM file('time.parquet', Parquet);
┌─n─┬───────time─┐
│ 0 │ 1673622611 │
│ 1 │ 1673622610 │
│ 2 │ 1673622609 │
│ 3 │ 1673622608 │
│ 4 │ 1673622607 │
└───┴────────────┘
이 경우 타입 변환을 사용할 수 있어요.
SELECT
n,
toDateTime(time) <--- int to time
FROM file('time.parquet', Parquet);
┌─n─┬────toDateTime(time)─┐
│ 0 │ 2023-01-13 15:10:11 │
│ 1 │ 2023-01-13 15:10:10 │
│ 2 │ 2023-01-13 15:10:09 │
│ 3 │ 2023-01-13 15:10:08 │
│ 4 │ 2023-01-13 15:10:07 │
└───┴─────────────────────┘
더 읽어보기
ClickHouse는 다양한 시나리오와 플랫폼을 다루기 위해 텍스트·바이너리 여러 포맷을 지원해요. 다음 문서에서 더 많은 포맷과 작업 방법을 살펴보세요.
또한 clickhouse-local을 확인해 보세요. ClickHouse 서버 없이 로컬/원격 파일을 다룰 수 있는 휴대형 풀기능 도구예요.