

# 읽을 때 병합(MoR) 테이블 생성 예제
<a name="querying-hudi-merge-on-read-create-table-examples"></a>

Hudi는 MoR용 메타스토어에 두 개의 테이블을 만듭니다. 하나는 스냅샷 쿼리를 위한 테이블이고 하나는 읽기 최적화 쿼리를 위한 테이블입니다. 두 테이블 모두 쿼리가 가능합니다. 0.5.1 이전의 Hudi 버전에서는 읽기 최적화 쿼리용 테이블이 해당 테이블을 만들 때 지정한 이름을 갖습니다. Hudi 버전 0.5.1부터는 기본적으로 테이블 이름에 접미사 `_ro`가 붙습니다. 스냅샷 쿼리용 테이블의 이름은 지정한 이름에 `_rt`가 덧붙습니다.

## 분할되지 않은 읽을 때 병합(MoR) 테이블
<a name="querying-hudi-nonpartitioned-merge-on-read-table"></a>

다음 예제에서는 Athena에서 읽기 최적화 쿼리를 위한 분할되지 않은 MoR 테이블을 만듭니다. 읽기 최적화 쿼리는 `HoodieParquetInputFormat` 입력 형식을 사용합니다.

```
CREATE EXTERNAL TABLE `nonpartition_mor`(
  `_hoodie_commit_time` string, 
  `_hoodie_commit_seqno` string, 
  `_hoodie_record_key` string, 
  `_hoodie_partition_path` string, 
  `_hoodie_file_name` string, 
  `event_id` string, 
  `event_time` string, 
  `event_name` string, 
  `event_guests` int, 
  `event_type` string)
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' 
STORED AS INPUTFORMAT 
  'org.apache.hudi.hadoop.HoodieParquetInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' 
LOCATION
  's3://amzn-s3-demo-bucket/folder/nonpartition_mor/'
```

다음 예제에서는 Athena에서 스냅샷 쿼리를 위한 분할되지 않은 MoR 테이블을 만듭니다. 스냅샷 쿼리의 경우 `HoodieParquetRealtimeInputFormat` 입력 형식을 사용합니다.

```
CREATE EXTERNAL TABLE `nonpartition_mor_rt`(
  `_hoodie_commit_time` string, 
  `_hoodie_commit_seqno` string, 
  `_hoodie_record_key` string, 
  `_hoodie_partition_path` string, 
  `_hoodie_file_name` string, 
  `event_id` string, 
  `event_time` string, 
  `event_name` string, 
  `event_guests` int, 
  `event_type` string)
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' 
STORED AS INPUTFORMAT 
  'org.apache.hudi.hadoop.realtime.HoodieParquetRealtimeInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' 
LOCATION
  's3://amzn-s3-demo-bucket/folder/nonpartition_mor/'
```

## 분할된 읽을 때 병합(MoR) 테이블
<a name="querying-hudi-partitioned-merge-on-read-table"></a>

다음 예제에서는 Athena에서 읽기 최적화 쿼리를 위한 분할된 MoR 테이블을 만듭니다.

```
CREATE EXTERNAL TABLE `partition_mor`(
  `_hoodie_commit_time` string, 
  `_hoodie_commit_seqno` string, 
  `_hoodie_record_key` string, 
  `_hoodie_partition_path` string, 
  `_hoodie_file_name` string, 
  `event_id` string, 
  `event_time` string, 
  `event_name` string, 
  `event_guests` int)
PARTITIONED BY ( 
  `event_type` string)
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' 
STORED AS INPUTFORMAT 
  'org.apache.hudi.hadoop.HoodieParquetInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION
  's3://amzn-s3-demo-bucket/folder/partition_mor/'
```

다음 `ALTER TABLE ADD PARTITION` 예제에서는 `partition_mor` 테이블 예제에 2개의 파티션을 추가합니다.

```
ALTER TABLE partition_mor ADD
  PARTITION (event_type = 'one') LOCATION 's3://amzn-s3-demo-bucket/folder/partition_mor/one/'
  PARTITION (event_type = 'two') LOCATION 's3://amzn-s3-demo-bucket/folder/partition_mor/two/'
```

다음 예제에서는 Athena에서 스냅샷 쿼리를 위한 분할된 MoR 테이블을 만듭니다.

```
CREATE EXTERNAL TABLE `partition_mor_rt`(
  `_hoodie_commit_time` string, 
  `_hoodie_commit_seqno` string, 
  `_hoodie_record_key` string, 
  `_hoodie_partition_path` string, 
  `_hoodie_file_name` string, 
  `event_id` string, 
  `event_time` string, 
  `event_name` string, 
  `event_guests` int)
PARTITIONED BY ( 
  `event_type` string)
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT 
  'org.apache.hudi.hadoop.realtime.HoodieParquetRealtimeInputFormat'
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION
  's3://amzn-s3-demo-bucket/folder/partition_mor/'
```

마찬가지로 다음 `ALTER TABLE ADD PARTITION` 예제에서는 `partition_mor_rt` 테이블 예제에 2개의 파티션을 추가합니다.

```
ALTER TABLE partition_mor_rt ADD
  PARTITION (event_type = 'one') LOCATION 's3://amzn-s3-demo-bucket/folder/partition_mor/one/'
  PARTITION (event_type = 'two') LOCATION 's3://amzn-s3-demo-bucket/folder/partition_mor/two/'
```