Herringbone은 Ruby 3.0 이상에서 Apache Parquet 파일을 읽고 쓸 수 있는 라이브러리다. Rails 데이터 내보내기, 파일 읽기와 결합, 암호화·삭제 처리 기능을 제공하며, 일부 선택 기능에는 별도 gem이 필요하다.
설치는 Gemfile에 다음 항목을 추가한다.
gem "herringbone"
Thrift gem이나 자체 네이티브 확장 없이 Thrift compact protocol, 인코딩, Snappy·LZ4 코덱을 Ruby로 구현했다. ZSTD와 Brotli에는 선택적 gem을 사용하며, ZSTD 파일 읽기와 Hadoop 시대 파일의 LZO 읽기도 순수 Ruby로 지원한다. ZSTD 쓰기에는 zstd-ruby가 필요하다. snappy, zstd-ruby, brotli, xxhash, numo-narray-alt를 추가하면 해당 기능을 사용할 수 있다. 자세한 내용은 선택적 gem 안내를 참고하면 된다.
중첩 구조를 깊이에 관계없이 처리하고, parquet-mr, Arrow, Spark, Impala, DuckDB, Rust 기반 작성 도구 등이 만든 파일을 읽는다. 배치·페이지 단위 읽기와 통계, 페이지 인덱스, 블룸 필터를 활용한 where: 조건 검색도 지원한다. Parquet 모듈식 암호화는 열별 암호화와 푸터 암호화를 지원하며 parquet-mr·Arrow와 호환된다.
Rails 관계나 Hash·Struct·Array의 열거형 데이터를 Parquet로 쓸 수 있다. 스키마는 열거형의 첫 1000개 행을 바탕으로 추론한다. S3에 임시 파일 없이 스트리밍하는 방법과 ActiveRecord·Google Cloud Storage 사용 조건은 Herringbone 설명서에서 확인할 수 있다.
파일을 읽을 때는 행 단위·배치 단위로 처리하거나 전체 행을 한 번에 읽을 수 있다. 열 선택과 조건 검색, CSV gem처럼 열 이름을 지정해 행을 추가하는 SimpleWriter도 제공한다. 직접 스키마와 열 유형을 지정하려면 Herringbone::Writer를 사용한다.
암호화는 키를 사용하며, 스키마·값·통계에 AES-256-GCM을 적용한다. 같은 키로 파일을 읽을 수 있고, 키 교체 시 새 키와 이전 키를 함께 지정할 수 있다. Herringbone 제작자는 pyarrow 25+, Arrow, DataFusion, Trino, Spark에서도 같은 파일을 열 수 있다고 설명한다. 열별 키와 평문 푸터 등 세부 조건은 암호화 안내에 정리돼 있다.
Herringbone.redact는 행을 삭제하거나 값을 바꾸고 열을 제거해 파일을 다시 쓴다. 변경되지 않은 파일 부분은 바이트 단위로 복사한다. 같은 스키마를 가진 파일은 디코딩 없이 행 그룹을 복사해 결합할 수 있으며, 열 구성이 다르면 schema: :union으로 누락된 값을 null로 채우거나 schema: :intersect로 공통 열만 남긴다. 옵션과 사용법은 삭제 처리 안내와 파일 결합 안내를 참고하면 된다.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요