SparklyR:直接转换为镶木地板

时间:2017-06-19 06:58:32

标签: r apache-spark sparklyr

您好我是群集计算新手,目前我只在独立群集(sc <- spark_connect(master = "local", version = '2.0.2'))上玩游戏。我有一个巨大的csv文件(15GB),我想将其转换为镶木地板文件(第三块代码解释了原因)。这个15GB的文件已经是6​​0GB文件的样本了,当我停止玩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​​中没有的低级功能,因为它很简单并且可以在很大程度上自动化。

1 个答案:

答案 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"))