Skip to main content

설명

Apache Parquet은 Hadoop 생태계에서 널리 사용되는 열 지향 저장 포맷입니다. ClickHouse는 이 포맷의 읽기 및 쓰기를 지원합니다.

데이터 타입 매핑

아래 표는 Parquet 데이터 타입이 ClickHouse 데이터 타입과 어떻게 매핑되는지 보여줍니다. Parquet 파일을 쓸 때 대응되는 Parquet 타입이 없는 데이터 타입은 가장 가까운 사용 가능한 타입으로 변환됩니다. 배열은 중첩될 수 있으며, 인수로 Nullable 타입 값을 가질 수 있습니다. TupleMap 타입도 중첩될 수 있습니다. ClickHouse 테이블 컬럼의 데이터 타입은 삽입된 Parquet 데이터의 해당 필드와 다를 수 있습니다. 데이터를 삽입할 때 ClickHouse는 먼저 위 표에 따라 데이터 타입을 해석한 다음, 데이터를 ClickHouse 테이블 컬럼에 설정된 데이터 타입으로 캐스팅합니다. 예를 들어 UINT_32 Parquet 컬럼은 IPv4 ClickHouse 컬럼으로 읽을 수 있습니다. 일부 Parquet 타입에는 밀접하게 대응되는 ClickHouse 타입이 없습니다. 이러한 타입은 다음과 같이 읽습니다.
  • TIME(하루 중 시간)은 타임스탬프로 읽습니다. 예: 10:23:13.0001970-01-01 10:23:13.000이 됩니다.
  • isAdjustedToUTC=falseTIMESTAMP/TIME은 로컬 wall-clock time입니다(어떤 시간대를 로컬로 간주하는지와 관계없이, 로컬 시간대 기준의 연, 월, 일, 시, 분, 초 및 소수 초 필드). 이는 SQL TIMESTAMP WITHOUT TIME ZONE과 같습니다. 하지만 ClickHouse는 이를 UTC 타임스탬프인 것처럼 읽습니다. 예: 2025-09-29 18:42:13.000(로컬 시계의 표시값을 나타냄)은 2025-09-29 18:42:13.000(시점을 나타내는 DateTime64(3, 'UTC'))이 됩니다. 이를 String으로 변환하면 올바른 연, 월, 일, 시, 분, 초 및 소수 초가 표시되며, 이후 이를 UTC가 아닌 어떤 로컬 시간대의 값으로 해석할 수 있습니다. 직관과 달리 타입을 DateTime64(3, 'UTC')에서 DateTime64(3)로 변경해도 도움이 되지 않습니다. 두 타입 모두 시계의 표시값이 아니라 시점을 나타내기 때문입니다. 다만 DateTime64(3)는 로컬 시간대를 사용해 잘못 포맷됩니다.
  • INTERVAL은 현재 Parquet 파일에 인코딩된 시간 인터벌의 원시 바이너리 표현이 담긴 FixedString(12)로 읽습니다.

Geo 타입 (GeoParquet)

ClickHouse는 GeoParquet 사양에 따라 지오메트리 컬럼의 읽기 및 쓰기를 지원합니다. 지오메트리 컬럼은 WKB로 인코딩된 BYTE_ARRAY 페이로드로 저장되며(읽을 때는 WKT), 파일 수준 Parquet 메타데이터의 JSON geo 키에는 각 지오메트리 컬럼의 인코딩, 지오메트리 타입, CRS가 설명되어 있습니다.

읽기 동작

읽을 때 지오메트리 컬럼은 해당하는 ClickHouse geo 데이터 타입으로 매핑됩니다.
  • Point, LineString, Polygon, MultiLineString 또는 MultiPolygon으로 선언된 컬럼은 이에 대응하는 ClickHouse geo 타입으로 읽어들입니다.
  • 여러 지오메트리 타입을 포함하거나 타입을 알 수 없는 컬럼은 지원되는 모든 geo 타입을 포괄하는 VariantGeometry 타입으로 읽어들입니다.
  • 요청한 컬럼 타입이 String이면 GeoParquet 메타데이터는 무시되며, 원시 인코딩된 지오메트리 payload를 그대로 반환합니다. 즉, GeoParquet 컬럼에 선언된 인코딩에 따라 WKB 또는 WKT 바이트를 반환합니다. 이는 설정 input_format_parquet_allow_geoparquet_parser0으로 설정된 경우에도 마찬가지입니다.

쓰기 동작

쓰기 시 Point, LineString, Polygon, MultiLineString 또는 MultiPolygon 타입의 최상위 컬럼은 BYTE_ARRAY(WKB)로 인코딩되며, 적절한 geo JSON 메타데이터가 Parquet 파일 footer에 추가됩니다. 최상위 Geometry Variant도 WKB BYTE_ARRAY payload로 인코딩되지만(하위 값은 WKB로 변환되어 Nullable(String) 컬럼에 저장됨), 이에 대해서는 geo 메타데이터가 출력되지 않으므로 읽을 때 GeoParquet 지오메트리 컬럼으로 인식되지 않습니다. Ring과 같은 다른 geo 관련 타입은 GeoParquet 메타데이터 없이 해당 네이티브 내부 표현으로 기록됩니다. 이 동작은 output_format_parquet_geometadata0으로 설정해 완전히 비활성화할 수 있으며, 이 경우 지원되는 geo 타입도 네이티브 내부 표현(PointTuple(Float64, Float64), LineStringArray(Point), PolygonArray(Array(Point)) 등)으로 기록되고 GeoParquet 메타데이터도 출력되지 않습니다. 지오메트리 컬럼은 스키마 루트에 있거나 Tuple(struct) 내부에 중첩되어 있어야 하며, Array 또는 Map 내부에 중첩하는 것은 지원되지 않습니다. geo 컬럼에는 Nullable도 지원되지 않습니다.

사용 예시

데이터 삽입

다음 데이터가 들어 있는 football.parquet라는 Parquet 파일을 사용합니다:
데이터를 삽입하세요:

데이터 읽기

다음과 같이 Parquet 포맷을 사용해 데이터를 읽습니다:
Parquet은 터미널에 사람이 읽을 수 있는 형태로 표시되지 않는 바이너리 형식입니다. Parquet 파일로 출력하려면 INTO OUTFILE을 사용하십시오.
Hadoop과 데이터를 주고받으려면 HDFS 테이블 엔진을 사용할 수 있습니다.

포맷 설정

마지막 수정일 2026년 7월 23일