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 데이터 타입:

  • JSON
  • ENUM.

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

더 알아보기 (Learn more)