【特報】
Acero 対 DuckDB 対 Polars
on R
2023-01-21 第103回R勉強会@東京
@eitsupi
rocker/r-ver
他のメンテナーうわああああ!
— えいつぴ (@eitsupi) December 28, 2022
r-polarsがpola-rs組織に移動しとる!https://t.co/ITA4w6tOPF
r-polars襲来!
data.table
パッケージの高速さのアピールに使用されたh2oai/db-benchmark
(最終更新2021年7月)の数々の項目でPython版polarsが上位に。出典:https://h2oai.github.io/db-benchmark/, 2023年1月21日閲覧
arrow
パッケージのdplyr
APIで呼び出されるやつ。summarise
にもjoin
にも対応していなかったので何もしておらず全部素のdplyr
で計算されていたはず。出典:https://tmonster.github.io/h2oai-db-benchmark/, 2023年1月21日閲覧
Parquetに対するクエリでは遅延評価を行い不要な行や列を読み飛ばせるため、CSVを読み込んで処理する場合に比べて高速かつ省メモリで処理を完了できる。
いつものParquet5(およそ600万行)で試してみましょう。
library(arrow, warn.conflicts = FALSE)
library(dplyr, warn.conflicts = FALSE)
open_dataset("lineitemsf1.snappy.parquet") |>
filter(
l_shipdate >= "1994-01-01",
l_shipdate < "1995-01-01",
l_discount >= 0.05,
l_discount < 0.07,
l_quantity < 24
) |>
summarise(revenue = sum(l_extendedprice * l_discount, na.rm = TRUE)) |>
collect()
library(duckdb)
con <- dbConnect(duckdb(), ":memory:")
query <- "
FROM
'lineitemsf1.snappy.parquet'
SELECT
SUM(l_extendedprice * l_discount) AS revenue
WHERE
l_shipdate >= '1994-01-01'
AND l_shipdate < '1995-01-01'
AND l_discount >= 0.05
AND l_discount < 0.07
AND l_quantity < 24
"
dbGetQuery(con, query)
library(duckdb)
library(dplyr, warn.conflicts = FALSE)
library(dbplyr, warn.conflicts = FALSE)
con <- dbConnect(duckdb(), ":memory:")
tbl(con, "lineitemsf1.snappy.parquet") |>
filter(
l_shipdate >= "1994-01-01",
l_shipdate < "1995-01-01",
l_discount >= 0.05,
l_discount < 0.07,
l_quantity < 24
) |>
summarise(revenue = sum(l_extendedprice * l_discount, na.rm = TRUE)) |>
collect()
library(rpolars)
scan_parquet("lineitemsf1.snappy.parquet")$filter(
(pl$col("l_shipdate") >= "1994-01-01") &
(pl$col("l_shipdate") < "1995-01-01") &
(pl$col("l_discount") >= 0.05) &
(pl$col("l_discount") < 0.07) &
(pl$col("l_quantity") < 24)
)$select(
(pl$col("l_extendedprice") * pl$col("l_discount"))$sum()$alias("revenue")
)$collect() |>
as.data.frame()
#Tokyo.R