我有20列和25条记录的数据框(小的标准数据。文件大小= 7KB)。我需要在数据帧中执行多个操作。循环可以在几秒钟内正常工作。问题是完成时,我尝试将show()或将数据写入磁盘时,我的CPU处于高内存状态持续了很多分钟(15-20分钟)。很多时候,我遇到stackoverflow或内存不足错误。
我的main()方法如下:
val spark = get_spark()
val i_file = args(1)
val df = spark.read
.format("csv")
.option("delimiter", ",")
.option("header", true)
.option("inferSchema","true")
.option("timestampFormat", "yyyy/MM/dd HH:mm:ss")
.load(i_file)
var s_df = something.calculate(spark,df)
/////////problem starts here ///////////
s_df.repartition(col("cluster_id")) //tried without repartition also
.write.mode("overwrite")
.option("header", "true").csv("C:\\Workspace\\data\\out.csv")
还有我的calculate()方法:
def calculate(spark: SparkSession, df: DataFrame): DataFrame = {
var newdf = init(spark, df) //some initialization on the dataframe
val t_count = 100
var t_i = 0
newdf.rdd.cache()
while (t_i < t_count) {
if(some codition){
newdf = calculate_type1(spark, newdf)
}else{
newdf = calculate_type2(spark, newdf)
}
t_i = t_i + 1
if(t_i === 50){
newdf.rdd.checkpoint()
}
}
return newdf
}
我的分析
注意到它可以使用更少的循环,例如t_count = 2,一切正常。
我相信问题在于,火花将图形保留在内存中, 尝试处理图形以生成最终数据帧。
我正在使用不正确的var,因此我应该使用val和 使用左折或zip更新原始rdd。但是我很努力 接着就,随即。有人可以帮忙吗?非常感谢!!!