【问题标题】:How best to handle converting a large local data frame to a SparkR data frame?如何最好地处理将大型本地数据帧转换为 SparkR 数据帧?
【发布时间】:2016-09-08 13:30:14
【问题描述】:

如何有效地将大型本地数据帧转换为 SparkR 数据帧?在我的本地开发机器上,当我尝试将其转换为 SparkR 数据帧时,大约 650MB 的本地数据帧很快超过了可用内存,并且我有一台具有 40GB 内存的开发机器。

library(reshape2)

years <- sample(1:10, 100, replace = T)
storms <- sample(1:10, 100, replace = T)
wind_speeds <- matrix(ncol = 316387, nrow = 100, 
                     data = sample(0:250, 31638700, replace = T))

df <- data.frame(year=years, storm=storms, ws = wind_speeds)
df <- melt(df, id.vars = c('year', 'storm'))

Sys.setenv(SPARK_HOME = "/home/your/path/spark-2.0.0-bin-hadoop2.7")
library(SparkR, lib.loc = c(file.path(Sys.getenv("SPARK_HOME"), "R", "lib")))
sparkR.session(master = "local[*]", sparkConfig = list(spark.driver.memory = "10g"))

spark_df <- as.DataFrame(df) #This quickly exceeds available memory 

【问题讨论】:

    标签: r sparkr


    【解决方案1】:

    我仍然对这个问题的答案非常感兴趣,但想发布我的工作。

    我的最终目标是将 5,000 个大型二进制文件转换为 parquet 格式,以便可以查询数据。我本来打算连续迭代它并使用 Spark write.parquet 函数,然后遇到了产生这个问题的问题。无论出于何种原因,Spark 都无法在内存不足的情况下将 650MB 本地数据帧转换为 SparkR 分布式数据帧(我的开发盒为 40 GB)。

    我为解决问题做了什么:

    • 使用 SparkR 将 5,000 个二进制文件并行转换为 CSV,使用 spark.lapply 调用我的转换函数

    • 使用 Apache Drill 将 CSV 文件转换为 parquet 格式

    • 这是大约 3.5TB 的数据,未压缩为 CSV 文件,最终以 parquet 格式达到大约 350 GB

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-08
      • 1970-01-01
      • 1970-01-01
      • 2021-12-21
      • 2017-02-25
      相关资源
      最近更新 更多