如何最好地处理将大型本地数据帧转换为SparkR数据帧?

时间:2016-09-08 13:30:14

标签: r sparkr

如何有效地将大型本地数据帧转换为SparkR数据帧?在我的本地开发机器上,当我尝试将其转换为SparkR数据帧时,一个~650MB的本地数据帧快速超过可用内存,而我有一台带有40GB Ram的开发机器。

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 

1 个答案:

答案 0 :(得分:0)

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

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

我为自己的工作做了什么:

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

  • 使用Apache Drill将CSV文件转换为镶木地板格式

  • 这是大约3.5TB未压缩为CSV文件的数据,在镶木地板格式中最终达到约350 GB