【问题标题】:SparklyR: Convert directly to parquetSparklyR:直接转换为镶木地板
【发布时间】:2017-11-21 06:54:42
【问题描述】:

您好,我是集群计算的新手,目前我只在独立集群 (sc <- spark_connect(master = "local", version = '2.0.2')) 上玩。我有一个巨大的 csv 文件(15GB),我想将其转换为 parquet 文件(第三块代码解释了原因)。这个 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 中不可用的低级函数,因为它很简单并且可以在很大程度上实现自动化。

【问题讨论】:

  • @Noobie 不幸的是没有。我认为通过设置 Hive 数据库而不使用 master = "local" 可以解决问题,但还没有尝试过。如果您发现任何问题,请发布到此提要,以供大家受益。
  • 你的数据有多宽,即你有很多变量,你需要处理所有的变量吗? memory=FALSE 标志告诉 Spark not 将完整的 DataFrame 加载到内存中...如果您只对一堆列感兴趣,这尤其有用。例如,如果你运行FILE %&gt;% select(var1, var2) %&gt;% filter(var2 &gt; 1) %&gt;% compute() 之类的东西,Spark 只会将选定和过滤的列加载到内存中,而不是整个数据帧。这大大加快了处理速度。
  • @ℕʘʘḆḽḘ 延迟与模式推断有关,没有保存数据。如果你想避免它,你应该明确地提供模式。

标签: r apache-spark sparklyr


【解决方案1】:

使用memory = FALSE 调用spark_read_csv 时不会保存任何数据。您的延迟与数据加载本身无关,而是与模式推断过程有关,这需要单独的数据扫描。

与使用模式推断一样方便,显式提供模式(作为命名向量)从列名映射到to type's simple string 在性能方面要好得多。例如,如果您要以 local 模式加载 iris 数据集:

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

【讨论】:

  • 我们在这里想念你:'(
猜你喜欢
  • 2018-01-04
  • 1970-01-01
  • 2017-05-06
  • 1970-01-01
  • 1970-01-01
  • 2017-12-30
  • 2014-11-25
  • 2018-11-09
  • 1970-01-01
相关资源
最近更新 更多