[DATA-002][입문] CSV·JSON·Parquet과 스키마 비교하기 > IT 기술 공유

본문 바로가기
사이트 내 전체검색

IT 기술 공유

[DATA-002][입문] CSV·JSON·Parquet과 스키마 비교하기

페이지 정보

profile_image
작성자 기술팀장
댓글 0건 조회 271회 작성일 26-08-30 02:35

본문

[이번 수업]

같은 데이터를 CSV, JSON, Parquet으로 저장해 차이를 확인합니다.

[선수지식]

DATA-001의 행·열·데이터 타입과 Python 리스트·딕셔너리를 알면 됩니다. Parquet 실습에는 공식 PyArrow를 사용합니다.

[학습목표]

1. CSV·JSON·Parquet의 구조와 용도를 구분한다.
2. 파일 형식에 따라 타입 정보가 달라지는 모습을 확인한다.


[핵심개념]

CSV는 구분자로 열을 나누는 텍스트 표입니다. 교환과 눈으로 확인하기 쉽지만 공통된 내장 스키마가 없어 49.5를 숫자로 읽을지 문자열로 읽을지 소비자가 정해야 합니다.

JSON은 객체와 배열로 중첩 구조를 표현하는 텍스트 형식입니다. 문자열·숫자·불리언·null을 구분하지만 모든 객체의 필드와 타입이 같다고 보장하지는 않습니다.

Parquet은 분석용 이진 열 지향 형식입니다. 같은 열의 값을 모아 저장하고 스키마, 압축과 인코딩 정보를 담을 수 있습니다. 필요한 열만 읽는 분석에 유리하지만 텍스트 편집기로 읽는 형식은 아닙니다.

스키마는 필드 이름, 타입, null 허용 여부 같은 구조의 약속입니다. 단위·값 범위·설명도 데이터 계약으로 더할 수 있습니다.

[따라하기]

새 폴더에서 PyArrow를 설치합니다. Windows는 첫 명령, macOS·Linux는 두 번째 명령입니다.

py -m pip install pyarrow
python3 -m pip install pyarrow

formats.py에 저장하세요.

import csv
import json
import pyarrow as pa
import pyarrow.parquet as pq

rows = [
    {"id": 1, "item": "키보드", "price": 49.5},
    {"id": 2, "item": "마우스", "price": 20.0},
]

schema = pa.schema([
    pa.field("id", pa.int64(), nullable=False),
    pa.field("item", pa.string(), nullable=False),
    pa.field("price", pa.float64(), nullable=False),
])

with open("data.csv", "w", newline="", encoding="utf-8") as f:
    writer = csv.DictWriter(f, fieldnames=rows[0].keys())
    writer.writeheader()
    writer.writerows(rows)

with open("data.json", "w", encoding="utf-8") as f:
    json.dump(rows, f, ensure_ascii=False)

table = pa.Table.from_pylist(rows, schema=schema)
pq.write_table(table, "data.parquet")

with open("data.csv", encoding="utf-8") as f:
    csv_price = next(csv.DictReader(f))["price"]

print("CSV price:", type(csv_price).__name__)
print("Parquet price:", table.schema.field("price").type)
print("rows:", table.num_rows)

Windows는 py formats.py, macOS·Linux는 python3 formats.py로 실행합니다. 예상 결과는 CSV price가 str, Parquet price가 double, rows가 2입니다. data.csv, data.json, data.parquet도 생성됩니다.

[흔한 실수]

첫째, CSV를 쉼표로 직접 split해 인용된 값을 깨뜨립니다. 둘째, 인코딩을 합의하지 않아 글자가 깨집니다. 셋째, JSON 객체마다 필드가 달라도 그대로 처리합니다. 넷째, Parquet을 압축된 CSV로만 생각합니다. 다섯째, 소비자 확인 없이 스키마를 바꿉니다.

[보안 주의]

개인정보·인증정보·비밀키를 예제 파일에 넣지 마세요. 외부 CSV를 스프레드시트로 열 때 =, +, -, @로 시작하는 값이 수식으로 처리될 수 있으므로 안전한 가져오기 절차로 검토합니다. JSON은 입력 크기와 중첩 깊이를 제한하고 예상 스키마를 검증하세요. Parquet도 신뢰할 수 있는 최신 라이브러리로 읽고 열·타입·행 수를 먼저 확인합니다. 파일 경로는 허용된 디렉터리 안으로 제한합니다.

[직접 해볼 과제]

quantity 정수 필드를 스키마와 두 행에 추가하세요. 두 번째 행에서 quantity를 빼면 Parquet 생성이 어떻게 반응하는지 확인하고 이 필드를 nullable로 둘지 이유를 적으세요.

[확인문제]

1. CSV의 price가 문자열로 읽힌 이유는 무엇인가요?
2. Parquet의 열 지향 저장은 어떤 분석에서 유리한가요?
3. 스키마에 필드 이름과 타입 외에 어떤 규칙을 기록할 수 있나요?

[다음 학습]

순환 커리큘럼의 다음 글은 SWE-002 읽기 쉬운 이름·함수·모듈입니다. 데이터 트랙에서는 DATA-003 데이터 정리와 결측치·이상치로 이어집니다.

[공식 참고 자료]

RFC 4180 CSV
https://www.rfc-editor.org/rfc/rfc4180.html

RFC 8259 JSON
https://www.rfc-editor.org/rfc/rfc8259.html

Apache Parquet 파일 형식
https://parquet.apache.org/docs/file-format/

PyArrow Parquet
https://arrow.apache.org/docs/python/parquet.html

PyArrow 스키마
https://arrow.apache.org/docs/python/generated/pyarrow.schema.html

Python csv
https://docs.python.org/3/library/csv.html

댓글목록

등록된 댓글이 없습니다.

회원로그인

회원가입

사이트 정보

회사명 : 회사명 / 대표 : 대표자명
주소 : OO도 OO시 OO구 OO동 123-45
사업자 등록번호 : 123-45-67890
전화 : 02-123-4567 팩스 : 02-123-4568
통신판매업신고번호 : 제 OO구 - 123호
개인정보관리책임자 : 정보책임자명

접속자집계

오늘
833
어제
5,103
최대
16,772
전체
771,887
Copyright © 소유하신 도메인. All rights reserved.