CSV/Excel → Iceberg 적재 (Bronze)
CSV 또는 Excel 파일을 Iceberg 테이블에 적재하는 가이드입니다. RAG/문서 적재(데이터 인제스천)와 달리, 이 워크플로우는 구조화된 행/열 데이터를 Trino 카탈로그의 분석용 테이블로 만듭니다. 적재된 테이블은 자동으로 Medallion Bronze 레이어로 태깅되어 SQL 편집기·BI·파이프라인 어디서든 즉시 사용할 수 있습니다.
- 사내 부서가 던져준 정산/거래 CSV 를 일회성으로 분석 테이블로 올리고 싶을 때
- Excel 보고서 한 시트를 그대로 데이터 마트 입력으로 쓰고 싶을 때
- 5만 행 이하의 경량 데이터를 빠르게 Iceberg 로 옮기고 싶을 때
- 5만 행을 넘는 데이터 — Phase 2-A 의
external_ctas라우팅으로 자동 처리(아래 대용량 파일 참조)
빠른 시작
사이드바 → 데이터 엔지니어링 → 파일·문서 수집 으로 이동한 뒤 CSV → Table 탭을 선택하세요. 3-step 마법사가 시작됩니다.
1. 업로드 → 2. 스키마 매핑 → 3. 적재
| Step | 무엇을 하나 | 자동 추론 항목 |
|---|---|---|
| 1. 업로드 | 파일 드롭 + 옵션 확인 | 인코딩, 구분자, 헤더 유무 |
| 2. 스키마 매핑 | 컬럼 이름/타입/제외 결정 | 컬럼명 정규화, 타입 (VARCHAR/BIGINT/DOUBLE/BOOLEAN) |
| 3. 적재 | Catalog/Schema 선택 + Table 입력 + commit | DataGrant 필터링 드롭다운 (#835), 호환성 미리보기 (append 모드) |
Step 1 — 업로드
CSV → Table 탭은 드롭존 한 줄로 시작합니다. 파일을 드래그하거나 영역을 클릭해 선택하세요.

| 옵션 | 기본값 | 설명 |
|---|---|---|
| 구분자 | 자동 감지 | , \t ; | 후보 중 가장 일관된 토큰 수를 선택 |
| 인코딩 | 자동 감지 | UTF-8 / EUC-KR / CP949 — confidence < 0.7 이면 명시 선택 강제 |
| 첫 행이 헤더 | 사용 | 끄면 컬럼명이 col_0, col_1… 로 자동 부여 |
제약
- 파일 한도: 100 MB (Phase 1 권장 ≤ 50 MB / ≤ 5 만 행)
- 같은 파일을 두 번 올리면 staging hash 중복으로 거부됩니다 — 같은 데이터를 다시 적재하려면 staging 정리 후 재시도
Step 2 — 스키마 미리보기 & 매핑
미리보기 를 누르면 파일 메타와 컬럼 추론 결과가 표로 나타납니다.

| 표시 항목 | 의미 |
|---|---|
| 원본 이름 | CSV 헤더 그대로 |
| 정규화 이름 | snake_case + 한글/특수문자 → col_{idx} 자동 변환. 직접 수정 가능 |
| 타입 | VARCHAR / BIGINT / DOUBLE / BOOLEAN / DATE / TIMESTAMP 자동 추론. dropdown 으로 변경 가능 |
| Nullable | NULL 허용 토글 |
| 제외 | 컬럼을 적재 대상에서 빼기 |
| 샘플 (앞 5개) | 첫 5 행 미리보기 |
한글 헤더(상품명, 금액)는 자동으로 col_0, col_1 형태로 정규화됩니다. 가독성을 위해 product_name, amount 처럼 직접 입력해 두면 BI/모델 단계에서 훨씬 편합니다.
Step 3 — 대상 테이블 설정 & 적재
마지막 단계에서 모드 와 대상 테이블 좌표 를 정합니다.

모드
| 모드 | 동작 | 사용 시점 |
|---|---|---|
| 새 테이블 생성 | CREATE TABLE … AS 실행 후 INSERT | 처음 올리는 데이터 |
| 기존 테이블에 추가 | INSERT 만 실행 (스키마 호환 검증 필수) | 일·주 단위 누적 적재 |
Catalog / Schema / Table
Catalog/Schema 는 드롭다운 으로 표시됩니다 (#835). 백엔드의 DataGrant 필터링이 자동 적용되어 본인이 접근 권한을 가진 카탈로그·스키마만 노출됩니다. 카탈로그를 선택하면 그 하위 스키마 목록이 자동으로 채워집니다 (cascade).

| 항목 | 권장값 (예시) | 비고 |
|---|---|---|
| Catalog | iceberg | 드롭다운에서 선택. 차단 목록: information_schema, system, jmx |
| Schema | default, bronze | 카탈로그 선택 후 활성화. 부서/도메인별 분리 권장 |
| Table | <도메인>_<엔터티>_<날짜> | 신규 테이블명 — 자유 입력. 예: sales_daily_2026_q1 |
드롭다운 맨 아래 "직접 입력…" 옵션을 고르면 자유 텍스트 입력 모드로 전환됩니다. 카탈로그/스키마가 아직 Trino 에 존재하지 않거나(예: 신규 도메인) 드롭다운 옵션이 비어 있을 때 사용하세요.
신규 스키마(namespace) 생성 (#836 완료): 카탈로그 페이지 사이드바 헤더의 + 액션으로 iceberg.temp_1 같은 새 namespace 를 만들 수 있습니다. 권한: admin 또는 catalog INSERT/ALL grant. 자세한 절차는 카탈로그 — 새 스키마 만들기 참조.
"목록으로" 링크로 언제든 드롭다운으로 복귀할 수 있습니다.
Catalog 를 다른 값으로 바꾸면 Schema 와 Table 입력값이 자동으로 비워집니다 — 이전 테이블명을 다른 카탈로그에 잘못 커밋하는 사고를 막기 위함입니다.
테이블 생성 + 적재 를 누르면 commit 이 실행되고, 마법사가 Step 1 로 reset 됩니다 (성공 신호). SQL 편집기에서 바로 검증할 수 있습니다.

Append 모드 — 기존 테이블에 누적
같은 스키마의 추가 데이터를 일·주 단위로 누적할 때 사용합니다. Step 3 에서 모드를 기존 테이블에 추가 로 바꾸면 호환성 미리보기가 즉시 표시됩니다.

기존 테이블 스키마 호환성
기존 컬럼 4개 / 매칭 4개 / 신규 0개
| 호환성 패턴 | 의미 | 결과 |
|---|---|---|
| 신규 0 / 매칭 N | 완전 호환 | INSERT 정상 |
| 신규 > 0 | CSV 에 기존 테이블에 없는 컬럼 존재 | UI 가 경고, commit 차단 |
| 매칭 < 기존 | CSV 에서 빠진 컬럼 존재 | 빠진 컬럼은 NULL 채움 (기존 컬럼이 nullable 일 때만) |
원본 CSV 의 price 가 BIGINT 로 추론되었는데 기존 테이블이 DOUBLE 이면 commit 이 거부됩니다. Step 2 에서 dropdown 으로 타입을 일치시키세요.
Excel(.xlsx) 시트 선택
다중 시트 Excel 파일을 올리면 Step 2 상단에 시트 선택 dropdown 이 추가됩니다.

다른 시트로 전환하면 컬럼/타입/샘플이 자동으로 재추론 됩니다. 시트마다 별도의 적재가 필요하면 시트별로 Step 3 까지 진행하세요.

| 시트 패턴 | 권장 적재 전략 |
|---|---|
| 시트 = 도메인 분리 (Sales / Inventory) | 시트별로 별도 테이블 |
| 시트 = 월별 분리 (2026-01 / 2026-02 …) | 첫 시트로 새 테이블 생성 → 나머지를 append |
| 시트 = 메타 + 데이터 혼재 | 데이터 시트만 선택, 메타 시트는 패스 |
xlsx 파일은 인코딩이 binary(100%) 로 표시됩니다 — Excel 의 ZIP 컨테이너이기 때문에 정상 표시입니다.
카탈로그에서 빠른 append 진입
카탈로그 트리에서 기존 테이블에 데이터를 더하고 싶을 때, 트리 노드를 우클릭 하면 단축 메뉴가 열립니다.

CSV 데이터 추가 를 누르면 데이터 수집 → CSV → Table 탭으로 이동합니다. Step 3 에서 카탈로그/스키마/테이블이 자동으로 채워져, 업로드 → 미리보기 → 적재만 하면 됩니다.
Lineage — 파일에서 테이블까지
적재가 끝나면 자동으로 file → table 리니지 엣지 가 기록됩니다. 거버넌스 → 데이터 리니지 에서 적재한 테이블을 조회하면 다음과 같은 카운트를 볼 수 있습니다.

upstream_count: 1 ← 원본 CSV 파일 노드
downstream_count: 0 ← 아직 파생 테이블 없음
total_nodes: 1
total_edges: 1
Bronze 테이블을 Silver/Gold 로 변환하면 downstream 이 자동으로 늘어납니다. 영향도 분석을 누르면 source 컬럼 → target 컬럼 매핑까지 추적 가능합니다.
대용량 파일 (5 만 행 이상)
5 만 행 또는 50 MB 임계 초과 파일은 commit 단계에서 Phase 2-A 자동 라우팅 이 동작합니다.
| commit_path | 트리거 | 내부 동작 |
|---|---|---|
batch_insert | ≤ 5 만 행 / ≤ 50 MB | 배치 INSERT (Trino values) |
external_ctas | > 5 만 행 / > 50 MB | object storage 에 staging upload → CTAS → external table 생성 |
external_ctas 라우팅은 hive 카탈로그(staging) 가 활성화되어야 합니다. 미설정 환경에서는 다음과 같이 명확한 에러를 반환합니다.

staging 스키마 생성 실패 (hive 카탈로그 확인)
대용량 파일을 정기적으로 다뤄야 한다면, 관리자에게 Trino hive 카탈로그 추가를 요청하거나 파일·문서 수집 파이프라인 (SFTP/S3 소스)으로 옮기는 것을 권장합니다.
제약 / 주의사항
- 파일 한도: 100 MB
- Phase 1 임계: 5 만 행 / 50 MB — 초과 시
external_ctas라우팅 (hive 카탈로그 필요) - Catalog 차단 목록:
information_schema,system,jmx— 적재 대상으로 지정 불가 - 인코딩 confidence < 0.7: 자동 감지 실패로 간주되어 명시 선택 강제
- 한글 컬럼명:
col_{idx}로 자동 정규화. 가독성 위해 직접 입력 권장 - staging 중복: 동일 content hash 의 파일은 staging 정리 전까지 재업로드 거부
참고
- 데이터 인제스천 — RAG/문서 적재 워크플로우 (이 가이드와 별개)
- Medallion 워크스루 — Bronze → Silver → Gold 변환
- 데이터 리니지 — 영향도 분석, 컬럼 단위 lineage
- 카탈로그 탐색 — Iceberg 테이블 메타데이터 조회
- API 참조:
POST /api/v1/ingestion/csv/preview,POST /api/v1/ingestion/csv/commit