Trino

[Trino/Hive] 파티션 저장된 S3 데이터 쿼리

비번변경 2024. 1. 22. 11:22

개요

2023.03.30 - [Trino/Hive] AWS S3 쿼리하기에서 Hive-connector를 이용해 S3 데이터를 Trino로 쿼리 하는 방법을 정리했다. 이번 글에서는 아래와 같은 구조로 저장된 S3 데이터를 Trino로 쿼리 하되, 데이터 조회 속도 개선을 위해 테이블 파티션을 사용하고자 한다.

s3://text_bucket/data/page_views/year=2023/month=12/day=10/1.parquet
s3://text_bucket/data/page_views/year=2023/month=12/day=11/1.parquet
s3://text_bucket/data/page_views/year=2023/month=12/day=12/1.parquet
s3://text_bucket/data/page_views/year=2023/month=12/day=13/1.parquet

방법을 정리한다.

 

 

스키마 생성

S3과 연동된 카탈로그에에 테이블을 생성할 schema를 생성한다. 

CREATE SCHEMA <CATALOG_NAME>.<SCHEMA_NAME>;

-- 예시
CREATE SCHEMA example.web;

location은 지정하지 않았다.

 

 

테이블 생성

생성한 schema에 쿼리할 파일 정보로 테이블을 생성한다.

CREATE TABLE example.web.page_views (
  view_time TIMESTAMP,
  user_id BIGINT,
  page_url VARCHAR,
  ds DATE,
  country VARCHAR,
  year VARCHAR,
  month VARCHAR,
  day VARCHAR
)
WITH (
  format = 'PARQUET', 
  external_location = 's3a://text_bucket/data/page_views',
  partitioned_by = ARRAY['year','month','day'] )
)

 

테이블 생성 시 필요한 파일과 디렉터리 구조는 다음과 같다.

  • 컬럼 정보 : 파일 내 컬럼 정보를 지정한다. DDL의 마지막 컬럼은 파티션 기준 컬럼들이 되어야 한다.
  • format : 파일의 확장자를 지정한다. Trino가 지원하는 파일 형식이어야 하며, 일부 형식은 카탈로그 설정(hive.storage-format)으로 구성할 수 있다. ORC, PARQUET, AVRO, RCBINARY, RCTEXT, SEQUENCEFILE, JSON, TEXTFILE, CSV, REGEX를 지정할 수 있다.
  • external_location : S3, Azure Blob Storage 등의 외부 Hive 테이블에 대한 URI를 지정한다.
  • partitioned_by : 파티션 기준 컬럼 정보를 지정한다.

 

테이블을 생성하고 바로 SELECT 문으로 데이터를 쿼리 해보면... 기대와 달리 아무 데이터도 보이지 않는데 한 가지 작업이 더 필요하다.

 

 

파일 시스템 - 메타스토어 간 파티션 정보 싱크

system.sync_partition_metadata 프로시저를 사용해 메타스토어의 파티션 목록을 확인하고 업데이트해야 한다.

system.sync_partition_metadata(schema_name, table_name, mode, case_sensitive)

-- 예시
CALL system.sync_partition_metadata('web', 'page_views', 'ADD');

mode 매개변수는 ADD, DROP, FULL 세 가지 값을 지정할 수 있다.

  • ADD : 파일 시스템에는 존재하지만 메타스토어에는 없는 파티션을 추가한다.
  • DROP : 메타스토어에는 존재하지만 파일 시스템에는 없는 파티션을 삭제한다.
  • FULL : ADD와 DROP 모두 수행한다.

 

 

메타스토어 내 파티션 정보 조회

테이블의 파티션 목록을 확인하고 싶다면 $partitions 변수를 이용할 수 있다.

SELECT * 
FROM <CATALOG_NAME>.<SCHEMA_NAME>."<TABLE_NAME>$partitions";

-- 예시
SELECT * 
FROM example.web."page_views$partitions";

 

 

참고 문서

https://trino.io/docs/current/connector/hive.html#table-properties

https://trino.io/docs/current/connector/hive.html#procedures