【特報】
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パッケージのdplyrAPIで呼び出されるやつ。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