我很好奇范围如何使用Data Frame和Spark。在下面的示例中,我有一个文件列表,每个文件都独立加载到数据框中,执行了一些操作,然后,我们将dfOutput
写入磁盘。
val files = getListOfFiles("outputs/emailsSplit")
for (file <- files){
val df = sqlContext.read
.format("com.databricks.spark.csv")
.option("delimiter","\t") // Delimiter is tab
.option("parserLib", "UNIVOCITY") // Parser, which deals better with the email formatting
.schema(customSchema) // Schema of the table
.load(file.toString) // Input file
val dfOutput = df.[stuff happens]
dfOutput.write.format("com.databricks.spark.csv").mode("overwrite").option("header", "true").save("outputs/sentSplit/sentiment"+file.toString+".csv")
}
for loop
内的每个数据帧都被丢弃了,还是留在内存中?答案 0 :(得分:1)
DataFrame
个对象很小。但是,它们可以在Spark执行程序中引用缓存中的数据,并且它们可以在Spark执行程序上引用shuffle文件。当DataFrame
被垃圾收集时,也会导致在执行程序上删除缓存和随机文件。
在您的代码中,循环之后没有对DataFrame的引用。所以他们是合格的垃圾收集。垃圾收集通常是响应内存压力而发生的。如果您担心随机文件填满磁盘,触发显式GC以确保删除不再引用的DataFrames的随机文件可能是有意义的。
根据您对DataFrame([stuff happens]
)的处理方式,可能没有数据存储在内存中。这是Spark中的默认操作模式。如果你只是想读取一些数据,转换它们,然后写出来,它将全部逐行发生,永远不会将任何数据存储在内存中。 (缓存仅在您明确要求时才会发生。)
尽管如此,我建议在遇到问题之前不要担心内存管理问题。