개요
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