În această postare recentă, am folosit Polars şi Duckdb Pentru a converti un fișier CSV mare în parchet în modul abur – și Python.
Diferite persoane m -au contactat și m -au întrebat: „Și în R?”
Răspuns simplu: Avem DuckDB și avem diferite legături Polars. Aici, folosim {Polars} care este în prezent revizuit în {Neopandas}.
Deci, să nu mai așteptăm!



Timpurile de rulare sunt pe un sistem Windows cu un procesor Intel I7-13700H.
Generați fișier CSV de 2,2 GB
Folosim {data.table} pentru a arunca un set de date generat aleatoriu cu 100 de rânduri mio într -un fișier CSV.
library(data.table) set.seed(1) n <- 1e8 df <- data.frame( X = sample(letters(1:3), n, TRUE), Y = runif(n), Z = sample(1:5, n, TRUE) ) fwrite(df, "data.csv")
Duckdb
Apoi, folosim Duckdb pentru a trage o interogare în fișier și pentru a transmite rezultatul în parchet.
Firele și RAM pot fi setate pe zbor, ceea ce este foarte convenabil. Setarea unei limite de memorie scăzută (de exemplu, 500 MB) va funcționa – încercați -o!
library(duckdb)
con <- dbConnect(duckdb(config = list(threads = "8", memory_limit = "4GB")))
system.time( # 3.5s
dbSendQuery(
con,
"
COPY (
SELECT Y, Z
FROM 'data.csv'
WHERE X == 'a'
ORDER BY Y
) TO 'data.parquet' (FORMAT parquet, COMPRESSION zstd)
"
)
)
# Check
dbGetQuery(con, "SELECT COUNT(*) N FROM 'data.parquet'") # 33329488
dbGetQuery(con, "SELECT * FROM 'data.parquet' LIMIT 5")
# Y Z
# 1 5.355105e-09 4
# 2 9.080395e-09 5
# 3 2.258457e-08 2
# 4 3.445894e-08 2
# 5 6.891787e-08 1
3,5 secunde – Uau! Fișierul rezultat arată bine. Este de 125 MB mare.
Polars
Să facem la fel cu Polars.
# Sys.setenv(NOT_CRAN = "true")
# install.packages("polars", repos = "https://community.r-multiverse.org")
library(polars)
polars_info()
system.time( # 9s
(
pl$scan_csv("data.csv")
$filter(pl$col("X") == "a")
$drop("X")
$sort("Y")
$sink_parquet("data.parquet", row_group_size = 1e5)
)
)
# Check
pl$scan_parquet("data.parquet")$head()$collect()
# shape: (5, 2)
# ┌───────────┬─────┐
# │ Y ┆ Z │
# │ --- ┆ --- │
# │ f64 ┆ i64 │
# ╞═══════════╪═════╡
# │ 5.3551e-9 ┆ 4 │
# │ 9.0804e-9 ┆ 5 │
# │ 2.2585e-8 ┆ 2 │
# │ 3.4459e-8 ┆ 2 │
# │ 6.8918e-8 ┆ 1 │
# └───────────┴─────┘
Cu nouă secunde, este mai lent decât Duckdb. Dar ieșirea arată așa cum era de așteptat și are aceeași dimensiune ca în cazul Duckdb.
Cuvinte finale
- Cu Duckdb sau Polars, conversia CSV-urilor în parchet este ușoară și rapidă, chiar și în situații mai mari decât ram.
- Putem aplica filtre, selecții, sortări etc. în zbor.
- Hai să fim cu ochii pe Polars în R. Pare foarte interesant.
R script
