C.W.K.
Stream
Lesson 04 of 06 · published

Apache Arrow — 본드 포맷

~10 min · arrow, format, interop

Level 0구경꾼
0 XP0/47 lessons0/11 achievements
0/120 XP to next level120 XP to go0% complete

파일 포맷 아니라 in-memory 표준

Apache Arrow 는 Pandas (3.0+), Polars, DuckDB, PyArrow, 그리고 많은 DB 클라이언트 라이브러리들이 내부적으로 쓰는 언어 독립적 columnar 메모리 포맷. Disk 에 archival 로 쓰는 파일 포맷이 아니야 (Arrow IPC 파일 존재하긴 함); 도구 사이 데이터 이동을 싸게 만드는 in-memory 표현이야.

실전에서 왜 중요해?

옛 세상: 메모리의 Pandas DataFrame 은 한 방식으로 byte 배치, Spark DataFrame 은 다른 방식, PostgreSQL row 는 세 번째 방식. 사이 이동마다 serialize-deserialize. Arrow 가 평탄화해: 양쪽이 Arrow 말하면 같은 메모리 buffer 공유 — copy 없음, serialization 없음, 포맷 변환 없음. pl.from_pandas(df), duckdb.sql(...).arrow(), arrow_table.to_pandas(zero_copy_only=True) 가 ms 대신 µs 연산이 돼.

Arrow 직접 만질 때

  • Parquet 보다 빨리 로드되는 도구-중립 disk 포맷 원할 때 (단기 scratch 용 Arrow IPC).
  • REST/JSON 대신 Arrow Flight 로 네트워크 데이터 ship.
  • pd.read_parquet 가 노출 안 하는 기능 필요해서 pyarrow.parquet 직접 호출.

대부분 Arrow 직접 import 안 해. Arrow-aware 라이브러리 고르면 stack 의 나머지가 빠르게 느껴진다는 걸 알아챌 뿐.

Code

Pandas ↔ Arrow ↔ Polars copy 없이 round-trip·python
import pandas as pd
import pyarrow as pa
import polars as pl

pdf = pd.DataFrame({'order_id': ['A1', 'A2'], 'amount': [100.0, 250.0]})

# Pandas → Arrow (Arrow-backed dtype 이미 있으면 zero-copy)
tbl = pa.Table.from_pandas(pdf)

# Arrow → Polars (zero-copy)
pl_df = pl.from_arrow(tbl)

# Polars → Arrow → Pandas
back_to_pandas = pl_df.to_arrow().to_pandas(types_mapper=pd.ArrowDtype)
print(back_to_pandas.dtypes)        # Arrow-backed dtype 보존됨

External links

Exercise

1M row Pandas DataFrame 만들어. pa.Table.from_pandas 로 Arrow 변환. tbl.nbytes (Arrow 의 테이블 크기 인식) 출력하고 pdf.memory_usage(deep=True).sum() (Pandas 의 인식) 과 비교. 둘이 가까울수록 Pandas DataFrame 이 Arrow 에 깔끔히 매핑된 거 — "이 DataFrame 이 PyArrow-backed dtype 이미 쓰나?" 의 유용한 proxy.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.