Iceberg (partition, scheme evolution)

Q·2025년 3월 29일

Iceberg

목록 보기
2/14
  • Hive 테이블은 파티셔닝을 변경 X 따라서 파티션을 변경하려면 새로운 테이블을 만들어야하고 그에 따른 쿼리 재작성도 필수로 불편함이 따른다.
  • Iceberg는 Partitioning Evolution 및 Schema Evolution을 제공하여 Hive에서의 불편함을 해결할 수 있다.

Scheme Evolution

1. CREATE TABLE 후 확인

CREATE TABLE schemaev (
  ID BIGINT,
  NAME STRING
)
USING iceberg
LOCATION 's3a://martinispark/schemaev'

2. 새로운 COLUMN 추가

ALTER TABLE schemaev ADD COLUMNS (
    new_column string comment 'new'
);

  • JSON 파일이 하나 추가된 것 확인

3. INSERT INTO Data

INSERT INTO schemaev VALUES (1,'martini','new1'), (2,'jack','new2')

  • 변경 이력까지 JSON으로 저장되어서 데이터가 저장될 때 마다 반영 됨
....
"schemas" : [ {
    "type" : "struct",
    "schema-id" : 0,
    "fields" : [ {
      "id" : 1,
      "name" : "ID",
      "required" : false,
      "type" : "string"
    }, {
      "id" : 2,
      "name" : "NAME",
      "required" : false,
      "type" : "string"
    } ]
  }, {
    "type" : "struct",
    "schema-id" : 1,
    "fields" : [ {
      "id" : 1,
      "name" : "ID",
      "required" : false,
      "type" : "string"
    }, {
      "id" : 2,
      "name" : "NAME",
      "required" : false,
      "type" : "string"
    }, {
      "id" : 3,
      "name" : "new_column",
      "required" : false,
      "type" : "string",
      "doc" : "new"
    } ]
  } ],
  
  ...
  
  "manifest-list" : "s3a://martinispark/schemaev/metadata/snap-9156582206091879578-1-15c2ced9-b970-4aa3-b204-27dc37b231a3.avro",

AVRO 파일은 실제 데이터가 확인된다.

[
   {
      "status":1,
      "snapshot_id":9156582206091879578,
      "sequence_number":null,
      "file_sequence_number":null,
      "data_file":{
         "content":0,
         "file_path":"s3a://martinispark/schemaev/data/00000-6-2514eb04-1b8a-4a07-82d7-7fd7427e75f4-00001.parquet",
         "file_format":"PARQUET",
         "partition":{
         },
         "record_count":1,
         "file_size_in_bytes":889,
         "column_sizes":[
         ],
         "value_counts":[
         ],
         "null_value_counts":[
         ],
         "nan_value_counts":[
            
         ],
         "lower_bounds":[
         ],
         "upper_bounds":[
         ],
         "key_metadata":null,
         "split_offsets":[
            4
         ],
         "equality_ids":null,
         "sort_order_id":0
      }
   },
   {
      "status":1,
      "snapshot_id":9156582206091879578,
      "sequence_number":null,
      "file_sequence_number":null,
      "data_file":{
         "content":0,
         "file_path":"s3a://martinispark/schemaev/data/00001-7-2514eb04-1b8a-4a07-82d7-7fd7427e75f4-00001.parquet",
         "file_format":"PARQUET",
         "partition":{
            
         },
         "record_count":1,
         "file_size_in_bytes":869,
         "column_sizes":[
         ],
         "value_counts":[
         ],
         "null_value_counts":[
         ],
         "nan_value_counts":[
            
         ],
         "lower_bounds":[
         ],
         "upper_bounds":[
         ],
         "key_metadata":null,
         "split_offsets":[
            4
         ],
         "equality_ids":null,
         "sort_order_id":0
      }
   }
]
  • JSON은 테이블 메타 정보 파일, ARVO는 데이터 메타 정보 파일
  • 만약 새로운 컬럼이 추가되면 이전에 있던 데이터들은 NULL로 표시

Partition Evolution

1. CREATE TABLE

CREATE TABLE partitionev (
  ID STRING,
  COUNTRY STRING,
  CITY STRING
)
USING iceberg
LOCATION 's3a://martinispark/partitionev'
PARTITIONED BY (COUNTRY)

2. INSERT INTO Data

Country Column을 기준으로 저장하고 있다.

INSERT INTO partitionev VALUES
                   (1,'south-korea','seoul'),
                   (2,'south-korea','busan'),
                   (3,'japan','tokyo'),
                   (4,'japan','osaka'),
                   (5,'china','beijing'),
                   (6,'china','sanghai')

3. REPLACE PARTITION

ALTER TABLE partitionev REPLACE PARTITION FIELD COUNTRY WITH CITY
  • 기존 COUNTRY 파티션을 CITY로 변경

4. INSERT INTO Data

INSERT INTO partitionev VALUES
                   (7,'usa','california'),
                   (8,'usa','new-york'),
                   (9,'canada','ottawa'),
                   (10,'canada','toronto')

5. 조회

파티션들이 다르게 저장되는 것을 확인

참고

profile
Data Engineer

0개의 댓글