Apache Parquet はオープンソースの列指向データファイルフォーマットで、効率的なデータの保存と検索のために設計されています。
複雑なデータを一括処理するための高性能な圧縮とエンコード方式を提供し、多くのプログラミング言語と分析ツールでサポートされています。
Rの場合、arrowパッケージを使うことで Apache Parquet を扱うことができます。
まず必要なパッケージを読み込みます。
## ── 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
サンプルデータを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
)
## 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
環境によって変わりますが、私の貧弱なノートPCでざっと35倍の速さです!
Tidyverseのすべての処理にApache Parquetが対応しているわけでないのですが、前処理がかなり快適になるので積極的に Apache Parquet を使っていきましょう!
以下の資料も参考になります。
Apache Arrow 鬼はええ!このままCSV全部Parquetに変換していこうぜ!
以上です。