Arrow 형식
Arrow 형식
Arrow 형식은 Apache Arrow의 컬럼형 저장소 형식 가운데 하나로, ClickHouse에서 이 형식의 읽기와 쓰기를 지원해요. Apache Arrow에는 내장된 두 가지 컬럼형 저장 형식이 있으며, Arrow는 메모리 내 임의 접근을 위해 설계된 "파일 모드" 형식입니다.
출처: 문서
본문
| Input | Output | Alias |
|---|---|---|
| ✔ | ✔ |
설명 (Description)
Apache Arrow에는 두 가지 내장된 컬럼형 저장 형식이 있습니다. ClickHouse는 이 형식들의 읽기 및 쓰기 연산을 지원합니다.
Arrow는 Apache Arrow의 "파일 모드" 형식으로, 메모리 내 임의 접근을 위해 설계되었습니다.
데이터 타입 매칭 (Data types matching)
아래 표는 지원되는 데이터 타입과 INSERT, SELECT 쿼리에서 ClickHouse 데이터 타입에 어떻게 대응하는지 보여줍니다.
| Arrow data type ( INSERT ) | ClickHouse data type | Arrow data type ( SELECT ) |
|---|---|---|
| BOOL | Bool | BOOL |
| UINT8 , BOOL | UInt8 | UINT8 |
| INT8 | Int8 / Enum8 | INT8 |
| UINT16 | UInt16 | UINT16 |
| INT16 | Int16 / Enum16 | INT16 |
| UINT32 | UInt32 | UINT32 |
| INT32 | Int32 | INT32 |
| UINT64 | UInt64 | UINT64 |
| INT64 | Int64 | INT64 |
| FLOAT , HALF_FLOAT | Float32 | FLOAT32 |
| DOUBLE | Float64 | FLOAT64 |
| DATE32 | Date32 | UINT16 |
| DATE64 | DateTime | UINT32 |
| TIMESTAMP | DateTime64 | TIMESTAMP |
| TIME32 , TIME64 | Time64 | TIME32 , TIME64 |
| STRING , BINARY | String | BINARY |
| STRING , BINARY , FIXED_SIZE_BINARY | FixedString | FIXED_SIZE_BINARY |
| DECIMAL | Decimal | DECIMAL |
| DECIMAL256 | Decimal256 | DECIMAL256 |
| LIST | Array | LIST |
| STRUCT | Tuple | STRUCT |
| MAP | Map | MAP |
| UINT32 | IPv4 | UINT32 |
| FIXED_SIZE_BINARY , BINARY | IPv6 | FIXED_SIZE_BINARY |
| FIXED_SIZE_BINARY , BINARY | Int128/UInt128/Int256/UInt256 | FIXED_SIZE_BINARY |
| DURATION | Interval (Nanosecond/Microsecond/Millisecond/Second) | DURATION |
| INT64 | Interval (Minute/Hour/Day/Week/Month/Quarter/Year) | INT64 |
배열(Array)은 중첩될 수 있고 인자로 Nullable 타입의 값을 가질 수 있습니다. Tuple과 Map 타입도 중첩될 수 있어요.
DICTIONARY 타입은 INSERT 쿼리에서 지원되며, SELECT 쿼리에는 LowCardinality 타입을 DICTIONARY 타입으로 출력할 수 있게 하는 output_format_arrow_low_cardinality_as_dictionary 설정이 있습니다. LowCardinality 딕셔너리에는 사용되지 않는 값이 있을 수 있으며, 이로 인해 출력 시 Arrow DICTIONARY에 사용되지 않는 값이 생길 수 있다는 점에 유의하세요.
지원되지 않는 Arrow 데이터 타입:
JSONENUM.
ClickHouse 테이블 컬럼의 데이터 타입이 해당 Arrow 데이터 필드와 일치할 필요는 없습니다. 데이터를 삽입할 때 ClickHouse는 위 표에 따라 데이터 타입을 해석하고, 그런 다음 데이터를 ClickHouse 테이블 컬럼에 설정된 데이터 타입으로 캐스팅합니다.
사용 예시 (Example usage)
아래 예시에서는 ClickHouse SQL 플레이그라운드에서 사용 가능한 forex 데이터셋을 사용합니다.
데이터 선택 (Selecting data)
플레이그라운드에서 EUR/USD 환율 하루치를 선택하여 로컬 forex_eurusd.arrow 파일에 저장합니다. 호스트는 sql-clickhouse.clickhouse.com이고 사용자는 demo(비밀번호 없음)인 HTTP 인터페이스로 쿼리합니다:
curl "https://sql-clickhouse.clickhouse.com:8443/?user=demo&database=forex" \
--data-binary "
SELECT
concat(base, '.', quote) AS base_quote,
datetime AS last_update,
CAST(bid, 'Float32') AS bid,
CAST(ask, 'Float32') AS ask,
ask - bid AS spread
FROM forex
WHERE base = 'EUR' AND quote = 'USD'
AND datetime >= '2020-01-01' AND datetime < '2020-01-02'
ORDER BY datetime ASC
FORMAT Arrow
SETTINGS output_format_arrow_compression_method='zstd'" > forex_eurusd.arrow
파일 다시 읽기 (Reading the file back)
이제 로컬 Arrow 파일을 clickhouse-local과 file 테이블 함수를 사용하여 다시 읽을 수 있습니다. 파일은 자체 기술(self-describing) 형식이므로 Arrow 형식이 스키마를 자동으로 추론합니다:
clickhouse-local --query "
SELECT *
FROM file('forex_eurusd.arrow', Arrow)
ORDER BY last_update ASC
LIMIT 5
FORMAT PrettyCompact"
응답
┌─base_quote─┬─────────────last_update─┬─────bid─┬─────ask─┬────────────────spread─┐
1. │ EUR.USD │ 2020-01-01 17:00:00.065 │ 1.1212 │ 1.12172 │ 0.0005199909210205078 │
2. │ EUR.USD │ 2020-01-01 17:00:10.447 │ 1.1212 │ 1.12192 │ 0.0007200241088867188 │
3. │ EUR.USD │ 2020-01-01 17:00:10.498 │ 1.12117 │ 1.12161 │ 0.0004400014877319336 │
4. │ EUR.USD │ 2020-01-01 17:00:12.579 │ 1.1212 │ 1.12161 │ 0.0004100799560546875 │
5. │ EUR.USD │ 2020-01-01 17:00:12.630 │ 1.1212 │ 1.12172 │ 0.0005199909210205078 │
└────────────┴─────────────────────────┴─────────┴─────────┴───────────────────────┘
데이터 삽입 (Inserting data)
Arrow 파일을 ClickHouse 테이블에 로드하려면 FORMAT Arrow와 함께 clickhouse-client로 파이프하면 됩니다:
cat forex_eurusd.arrow | clickhouse-client --query="INSERT INTO some_table FORMAT Arrow"
형식 설정 (Format settings)
| Setting | Description | Default |
|---|---|---|
| input_format_arrow_allow_missing_columns | Arrow 입력 형식을 읽을 때 누락된 컬럼 허용 | 1 |
| input_format_arrow_case_insensitive_column_matching | Arrow 컬럼을 CH 컬럼과 매칭할 때 대소문자 무시. | 0 |
| input_format_arrow_import_nested | 더 이상 사용되지 않는 설정, 아무것도 하지 않음. | 0 |
| input_format_arrow_skip_columns_with_unsupported_types_in_schema_inference | Arrow 형식의 스키마 추론 중 지원되지 않는 타입의 컬럼 건너뛰기 | 0 |
| output_format_arrow_compression_method | Arrow 출력 형식의 압축 방법. 지원 코덱: lz4_frame, zstd, none (압축 안 함) | lz4_frame |
| output_format_arrow_fixed_string_as_fixed_byte_array | FixedString 컬럼에 Binary 대신 Arrow FIXED_SIZE_BINARY 타입 사용. | 1 |
| output_format_arrow_low_cardinality_as_dictionary | LowCardinality 타입을 Dictionary Arrow 타입으로 출력 활성화 | 0 |
| output_format_arrow_record_batch_size | 작은 블록을 결합할 때 레코드 배치당 대상 행 수. 버퍼링은 메모리 사용을 늘리고 첫 배치가 쿼리 완료까지 지연될 수 있음. 0이면 행 대상 비활성화. | 0 |
| output_format_arrow_record_batch_size_bytes | 레코드 배치당 누적 블록 데이터의 대상 바이트. 버퍼링은 메모리 사용을 늘리고 첫 배치가 쿼리 완료까지 지연될 수 있음. 0이면 바이트 대상 비활성화. | 0 |
| output_format_arrow_string_as_string | String 컬럼에 Binary 대신 Arrow String 타입 사용 | 1 |
| output_format_arrow_unsupported_types | Arrow에 대응하는 타입이 없는 타입(예: JSON , Dynamic , QBit , AggregateFunction )에 무엇을 쓸지: throw , text (행당 serializeText 값 하나, String 컬럼이 사용할 Arrow 타입으로) 또는 binary (행당 serializeBinary 값 하나, Arrow Binary 로). AggregateFunction은 텍스트 형식이 원시 집계 상태이므로 text 모드에서도 Binary 입니다. | binary |
| output_format_arrow_unsupported_types_as_binary | output_format_arrow_unsupported_types로 대체됨: 0은 throw , 1은 binary . 해당 설정이 기본값으로 남아 있는 동안만 참조됨. | 1 |
| output_format_arrow_use_64_bit_indexes_for_dictionary | Arrow 형식에서 딕셔너리 인덱스에 항상 64비트 정수 사용 | 0 |
| output_format_arrow_use_signed_indexes_for_dictionary | Arrow 형식의 딕셔너리 인덱스에 부호 있는 정수 사용 | 1 |