In ihrem Buch „R for Data Science“ (2017) empfehlen Grolemund und Wickham, data.table anstelle von dplyr zu verwenden, wenn man regelmäßig mit größeren Datensätzen (10 bis 100 GB) arbeitet. Da ich mit Wickhams sparklyr begonnen hatte – R’s Schnittstelle zu Spark im dplyr-Dialekt – wollte ich wissen, wie viel schneller data.table tatsächlich ist. Dies ist kein besonders professioneller Benchmark, da ich nur die Systemzeit vor und nach dem Skript vergleiche, aber er gibt einen Hinweis auf die Vor- und Nachteile beider Ansätze.
sparklyr
Zunächst habe ich einen Spark-Cluster lokal aufgesetzt und die Daten damit verarbeitet:
conf <- spark_config()
conf$spark.executor.memory <- "16G"
conf$spark.yarn.executor.memoryOverhead <- "4g"
conf$spark.memory.fraction <- 0.9
conf$spark.driver.maxResultSize <- "8G"
sc <- spark_connect(master = "local", version = "2.2.1", config = conf)
start_time <- Sys.time()
userDataSet <- spark_read_csv(sc, "country", "/home/tom/huge-file.csv", memory = FALSE)
end_time <- Sys.time()
end_time - start_time
# Time difference of 2.432772 mins
start_time <- Sys.time()
userDataSet <- userDataSet %>% filter(!is.na(Timestamp))
end_time <- Sys.time()
end_time - start_time
# Time difference of 3.437583 mins
data.table
Dann der Vergleich mit data.table:
library(data.table)
start_time <- Sys.time()
userDataSet <- fread("/home/tom/huge-file.csv")
end_time <- Sys.time()
end_time - start_time
# Time difference of 1.954231 mins
start_time <- Sys.time()
userDataSet <- userDataSet[!is.na(Timestamp)]
end_time <- Sys.time()
end_time - start_time
# Time difference of 0.06743789 secs
Fazit
Die Ergebnisse sprechen für sich: data.table ist beim Einlesen der Datei vergleichbar schnell wie sparklyr, bei der Filteroperation jedoch dramatisch überlegen – Sekunden statt Minuten. Für lokale Datensätze im Bereich von 10–100 GB ist data.table klar die bessere Wahl. sparklyr lohnt sich vor allem dann, wenn man auf ein echtes verteiltes Spark-Cluster zugreifen kann oder die dplyr-Syntax zwingend benötigt.