Spark DataFrame保存为镶木地板 - 内存不足

时间:2015-08-17 15:51:06

标签: scala apache-spark

我使用spark从s3读取文件,然后我将其加载到数据帧然后我尝试将其写入hdfs作为镶木地板。 问题是,当文件很大(65G)时,出于某种原因,我的内存不足......无论如何我不知道为什么我会得到内存不足,因为看起来数据分区很好。 / p>

这是我的代码的简称:

val records = gzCsvFile.filter { x => x.length == 31 }.map { x => 

   var d:Date = Date.valueOf(x(0))

      //var z = new GregorianCalendar();z.getWeekYear   

    var week = (1900+d.getYear )* 1000 + d.getMonth()*10 + Math.ceil(d.getDate()/7.0).toInt 
    Row(d, Timestamp.valueOf(x(1)), toLong( x(2)), toLong(x(3)), toLong(x(4)), toLong(x(5)), toLong(x(6)), toLong(x(7)), toLong(x(8)), toLong(x(9)), toLong(x(10)), toLong(x(11)), toLong(x(12)), toLong(x(13)), toLong(x(14)), toLong(x(15)), toLong(x(16)), toLong(x(17)), toLong(x(18)), toLong(x(19)), toLong(x(20)), toLong(x(21)), toLong(x(22)), toLong(x(23)), toLong(x(24)), toLong(x(25)), x(26).trim(), toLong(x(27)), toLong(x(28)), toLong(x(29)), toInt(x(30)),  week)
}
var cubeDF = sqlContext.createDataFrame(records, cubeSchema)
cubeDF.write.mode(SaveMode.Overwrite).partitionBy("CREATION_DATE","COUNTRY_ID","CHANNEL_ID" ).parquet(cubeParquetUrl)

有没有人知道发生了什么?

1 个答案:

答案 0 :(得分:1)

你遇到了这个错误:https://issues.apache.org/jira/browse/SPARK-8890

写出输出时Parquet的内存消耗比我们想象的要大得多。在即将发布的Spark 1.5中,我们转而在编写大量镶木地板分区之前对数据进行排序,以减少内存消耗。