您好我是群集计算新手,目前我只在独立群集(sc <- spark_connect(master = "local", version = '2.0.2')
)上玩游戏。我有一个巨大的csv文件(15GB),我想将其转换为镶木地板文件(第三块代码解释了原因)。这个15GB的文件已经是60GB文件的样本了,当我停止玩arround时,我需要使用/查询完整的60GB文件。目前我所做的是:
> system.time({FILE<-spark_read_csv(sc,"FILE",file.path("DATA/FILE.csv"),memory = FALSE)})
user system elapsed
0.16 0.04 1017.11
> system.time({spark_write_parquet(FILE, file.path("DATA/FILE.parquet"),mode='overwrite')})
user system elapsed
0.92 1.48 1267.72
> system.time({FILE<-spark_read_parquet(sc,"FILE", file.path("DATA/FILE.parquet"),memory = FALSE)})
user system elapsed
0.00 0.00 0.26
正如您所看到的,这需要相当长的时间。我想知道第一行代码(spark_read_csv
)和memory = FALSE
会发生什么?它在哪里读取/保存到?当我断开连接并再次重新连接会话时,我可以访问该位置吗?
另外,有没有办法将步骤1和步骤结合起来? 2以更有效的方式?
我并不羞于尝试使用API中没有的低级功能,因为它很简单并且可以在很大程度上自动化。
答案 0 :(得分:0)
用spark_read_csv
调用memory = FALSE
时不保存任何数据。您的延迟与这种数据加载无关,而与架构推断过程有关,后者需要单独的数据扫描。
使用模式推断虽然很方便,但是在性能上要好得多,即显式提供模式(作为命名向量)从列名到to type's simple string的映射。例如,如果要以local
模式加载虹膜数据集:
path <- tempfile()
readr::write_csv(iris, path)
您要使用的
spark_read_csv(
sc, "iris", path, infer_schema=FALSE, memory = FALSE,
columns = c(
Sepal_Length = "double", Sepal_Width = "double",
Petal_Length = "double", Petal_Width = "double",
Species = "string"))