Parquet 포맷
Parquet 포맷 (Parquet Format)
포맷: 직렬화 스키마 / 역직렬화 스키마. Apache Parquet 포맷은 Parquet 데이터를 읽고 쓸 수 있게 해줘요.
출처: 문서
본문
의존성 (Dependencies)
Parquet 포맷을 사용하려면 빌드 자동화 도구(Maven 또는 SBT)를 사용하는 프로젝트와 SQL JAR 번들이 있는 SQL Client 모두 다음 의존성이 필요해요.
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-parquet</artifactId>
<version>2.3.0</version>
</dependency>
Parquet 포맷으로 테이블 만들기 (How to create a table with Parquet format)
Filesystem 커넥터와 Parquet 포맷을 사용해 테이블을 만드는 예제예요.
CREATE TABLE user_behavior (
user_id BIGINT,
item_id BIGINT,
category_id BIGINT,
behavior STRING,
ts TIMESTAMP(3),
dt STRING
) PARTITIONED BY (dt) WITH (
'connector' = 'filesystem',
'path' = '/tmp/user_behavior',
'format' = 'parquet'
)
포맷 옵션 (Format Options)
| 옵션 (Option) | 필수 (Required) | 기본값 (Default) | 타입 (Type) | 설명 (Description) |
|---|---|---|---|---|
| format | required | (none) | String | 사용할 포맷을 지정해요. 여기서는 'parquet'이어야 해요. |
| parquet.utc-timezone | optional | false | Boolean | epoch time과 LocalDateTime 간 변환에 UTC 시간대 또는 로컬 시간대를 사용해요. Hive 0.x/1.x/2.x는 로컬 시간대를 사용하고, Hive 3.x는 UTC 시간대를 사용해요. |
| timestamp.time.unit | optional | micros | String | parquet int64/LogicalTypes 타임스탬프를 이 시간 단위로 저장해요. 값은 nanos/micros/millis예요. |
| write.int64.timestamp | optional | false | Boolean | parquet 타임스탬프를 int96/OriginalTypes 대신 int64/LogicalTypes로 써요. 참고: 타임스탬프는 시간대와 무관해집니다(다른 시간대로 절대 변환되지 않아요). |
Parquet 포맷은 ParquetOutputFormat의 구성도 지원해요. 예를 들어 parquet.compression=GZIP을 구성해 gzip 압축을 켤 수 있어요.
데이터 타입 매핑 (Data Type Mapping)
현재 Parquet 포맷 타입 매핑은 Apache Hive와 호환되지만 기본적으로 Apache Spark와는 호환되지 않아요:
- Timestamp: 정밀도와 무관하게 타임스탬프 타입을 int96으로 매핑해요.
- Spark 호환성은
write.int64.timestamp구성 옵션을 통한 int64가 필요해요(위 참고). - Decimal: 소수점 정밀도에 따라 decimal 타입을 고정 길이 바이트 배열로 매핑해요.
다음 표는 Flink 타입에서 Parquet 타입으로의 매핑을 나열해요.
| Flink 데이터 타입 | Parquet 타입 | Parquet 논리 타입 | 제약 |
|---|---|---|---|
| CHAR / VARCHAR / STRING | BINARY | UTF8 | |
| BOOLEAN | BOOLEAN | ||
| BINARY / VARBINARY | BINARY | ||
| DECIMAL | FIXED_LEN_BYTE_ARRAY | DECIMAL | |
| TINYINT | INT32 | INT_8 | |
| SMALLINT | INT32 | INT_16 | |
| INT | INT32 | ||
| BIGINT | INT64 | ||
| FLOAT | FLOAT | ||
| DOUBLE | DOUBLE | ||
| DATE | INT32 | DATE | |
| TIME | INT32 | TIME_MILLIS | |
| TIMESTAMP | INT96 (또는 INT64) | ||
| ARRAY | - | LIST | |
| MAP | - | MAP | Parquet는 null map key를 지원하지 않음 |
| MULTISET | - | MAP | Parquet는 null map key를 지원하지 않음 |
| ROW | - | STRUCT |