Convertirea CSV -urilor mari în mod arbitrar în parchet cu r

URMĂREȘTE-NE
16,065FaniÎmi place
1,142CititoriConectați-vă

Î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

Dominic Botezariu
Dominic Botezariuhttps://www.noobz.ro/
Creator de site și redactor-șef.

Cele mai noi știri

Pe același subiect

LĂSAȚI UN MESAJ

Vă rugăm să introduceți comentariul dvs.!
Introduceți aici numele dvs.