Apache Parquet とは

Apache Parquet はオープンソースの列指向データファイルフォーマットで、効率的なデータの保存と検索のために設計されています。

複雑なデータを一括処理するための高性能な圧縮とエンコード方式を提供し、多くのプログラミング言語と分析ツールでサポートされています。

Rの場合、arrowパッケージを使うことで Apache Parquet を扱うことができます。

まず必要なパッケージを読み込みます。

library(conflicted)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.1     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.1
## ✔ purrr     1.0.2
library(arrow)
library(microbenchmark) #処理速度測定のため

サンプルデータをread_parquet()関数で読み込みます。

この時、デフォルトではデータフレームとして、引数as_data_frame = FALSEを付けると Arrow Table として読み込まれます。

# データフレームとして
reservation_df <- read_parquet(
  "https://github.com/ghmagazine/awesomebook_v2/raw/main/data/reservation.parquet"
  )

#Arrow Table として
reservation_at <- read_parquet(
  "https://github.com/ghmagazine/awesomebook_v2/raw/main/data/reservation.parquet",
  as_data_frame = FALSE
  )

Arrow Table も通常のデータフレーム同様tidyverseで扱えますが、処理の最後にcollect()関数を実行しないと結果が得られません。

データフレームによる以下の処理を考えます。

reservation_df |>
  dplyr::filter(status != "canceled") |>
  summarise(
    reservation_cnt = n(),
    .by = c(hotel_id, customer_id)
    )

同じ処理を Arrow Table で行うにはこうします。 最後にcollect()が加わっただけです。

reservation_at |>
  dplyr::filter(status != "canceled") |>
  summarise(
    reservation_cnt = n(),
    .by = c(hotel_id, customer_id)
    ) |>
  collect() #この処理が加わっただけ

処理の速さを比べてみましょう。

df <- function() {
  reservation_df |>
    dplyr::filter(status != "canceled") |>
    summarise(
      reservation_cnt = n(),
      .by = c(hotel_id, customer_id)
    )
}

at <- function() {
  reservation_at |>
    dplyr::filter(status != "canceled") |>
    summarise(
      reservation_cnt = n(),
      .by = c(hotel_id, customer_id)
    ) |>
    collect() #この処理が加わっただけ
}

set.seed(1234)
res <- microbenchmark(
  data_frame = df(),
  arrow_table = at(),
  times = 100
  )
summary(res)
##          expr        min         lq      mean     median         uq        max
## 1  data_frame 15111.2864 15973.1028 16948.943 16409.7643 17651.8857 23159.4643
## 2 arrow_table   433.8274   458.3987   489.048   473.6471   492.2276   830.4927
##   neval
## 1   100
## 2   100
autoplot(res)

環境によって変わりますが、私の貧弱なノートPCでざっと35倍の速さです!

Tidyverseのすべての処理にApache Parquetが対応しているわけでないのですが、前処理がかなり快適になるので積極的に Apache Parquet を使っていきましょう!

以下の資料も参考になります。

Apache Arrow 鬼はええ!このままCSV全部Parquetに変換していこうぜ!

arrowパッケージの基礎

以上です。

Topへ