Arrow, Avro, ORC 데이터 다루기

Arrow, Avro, ORC 데이터 다루기

Apache는 분석 환경에서 널리 쓰이는 여러 데이터 포맷을 출시했는데, 대표적으로 Avro, Arrow, Orc가 있어요. ClickHouse는 이 목록 중 어떤 포맷으로도 데이터 가져오기(import)와 내보내기(export)를 지원한답니다.

출처: 문서

출처: 문서

본문

Avro 포맷으로 가져오기·내보내기

ClickHouse는 Hadoop 시스템에서 널리 쓰이는 Apache Avro 데이터 파일 읽기·쓰기를 지원해요. avro 파일에서 데이터를 가져오려면 INSERT 문에서 Avro 포맷을 사용해요.

INSERT INTO sometable
FROM INFILE 'data.avro'
FORMAT Avro

file() 함수를 쓰면 데이터를 실제로 가져오기 전에 Avro 파일을 탐색해 볼 수도 있어요.

SELECT path, hits
FROM file('data.avro', Avro)
ORDER BY hits DESC
LIMIT 5;

┌─path────────────┬──hits─┐
│ Amy_Poehler     │ 62732 │
│ Adam_Goldberg   │ 42338 │
│ Aaron_Spelling  │ 25128 │
│ Absence_seizure │ 18152 │
│ Ammon_Bundy     │ 11890 │
└─────────────────┴───────┘

Avro 파일로 내보내려면:

SELECT * FROM sometable
INTO OUTFILE 'export.avro'
FORMAT Avro;

Avro와 ClickHouse 데이터 타입

Avro 파일을 가져오거나 내보낼 때는 데이터 타입 매핑을 고려해야 해요. Avro 파일에서 데이터를 적재할 때 명시적인 타입 캐스팅으로 변환하세요.

SELECT
    date,
    toDate(date)
FROM file('data.avro', Avro)
LIMIT 3;

┌──date─┬─toDate(date)─┐
│ 16556 │   2015-05-01 │
│ 16556 │   2015-05-01 │
│ 16556 │   2015-05-01 │
└───────┴──────────────┘

Kafka의 Avro 메시지

Kafka 메시지가 Avro 포맷이라면 ClickHouse는 AvroConfluent 포맷과 Kafka 엔진을 사용해 그런 스트림을 읽을 수 있어요.

CREATE TABLE some_topic_stream
(
    field1 UInt32,
    field2 String
)
ENGINE = Kafka() SETTINGS
kafka_broker_list = 'localhost',
kafka_topic_list = 'some_topic',
kafka_group_name = 'some_group',
kafka_format = 'AvroConfluent';

Arrow 포맷으로 작업하기

또 다른 컬럼형 포맷으로 Apache Arrow가 있는데, ClickHouse가 가져오기·내보내기 모두 지원해요. Arrow 파일에서 데이터를 가져올 때는 Arrow 포맷을 사용해요.

INSERT INTO sometable
FROM INFILE 'data.arrow'
FORMAT Arrow

Arrow 파일로 내보내기도 같은 방식이에요.

SELECT * FROM sometable
INTO OUTFILE 'export.arrow'
FORMAT Arrow

또한 데이터 타입 매칭을 확인해서 어떤 것이 수동 변환이 필요한지 알아두세요.

Arrow 데이터 스트리밍

ArrowStream 포맷은 Arrow 스트리밍(인메모리 처리에 사용) 작업에 쓸 수 있어요. ClickHouse는 Arrow 스트림을 읽고 쓸 수 있어요. ClickHouse가 Arrow 데이터를 스트리밍하는 방법을 보여주기 위해, 다음 파이썬 스크립트로 파이프해 볼게요 (Arrow 스트리밍 포맷으로 입력 스트림을 읽고 결과를 Pandas 테이블로 출력해요).

import sys, pyarrow as pa

with pa.ipc.open_stream(sys.stdin.buffer) as reader:
  print(reader.read_pandas())

이제 ClickHouse에서 데이터를 스트리밍하려면 출력을 스크립트로 파이프하면 돼요.

clickhouse-client -q "SELECT path, hits FROM some_data LIMIT 3 FORMAT ArrowStream" | python3 arrow.py

                           path  hits
0       b'Akiba_Hebrew_Academy'   241
1           b'Aegithina_tiphia'    34
2  b'1971-72_Utah_Stars_season'     1

ClickHouse는 같은 ArrowStream 포맷으로 Arrow 스트림을 읽을 수도 있어요.

arrow-stream | clickhouse-client -q "INSERT INTO sometable FORMAT ArrowStream"

여기서 arrow-stream은 Arrow 스트리밍 데이터의 가능한 소스로 사용했어요.

ORC 데이터 가져오기·내보내기

Apache ORC 포맷은 주로 Hadoop에 쓰는 컬럼형 저장 포맷이에요. ClickHouse는 ORC 포맷으로 Orc 데이터 가져오기와 내보내기를 모두 지원해요.

SELECT *
FROM sometable
INTO OUTFILE 'data.orc'
FORMAT ORC;

INSERT INTO sometable
FROM INFILE 'data.orc'
FORMAT ORC;

또한 데이터 타입 매칭추가 설정을 확인해서 내보내기·가져오기를 튜닝하세요.

더 읽어보기

ClickHouse는 다양한 시나리오와 플랫폼을 다루기 위해 텍스트·바이너리 여러 포맷을 지원해요. 다음 문서에서 더 많은 포맷과 작업 방법을 살펴보세요.

또한 clickhouse-local을 확인해 보세요. ClickHouse 서버 없이 로컬/원격 파일을 다룰 수 있는 휴대형 풀기능 도구예요.

더 알아보기 (Learn more)