我正在尝试解决spark scala应用程序中的堆内存问题,并试图了解其泄漏的内存资源在哪里。我正在加载数据以生成spark datafraame,并在其之上具有临时表。 当我取消持久化时,默认情况下该表也将被清除吗?我尝试在测试程序中对此进行模拟,但是行为不一致
val data = Seq(Row("1","2020-05-11 15:17:57.188","2020"))
val schemaOrig = List( StructField("key",StringType,true)
,StructField("txn_ts",StringType,true)
,StructField("txn_dt",StringType,true))
val sourceDf = spark.createDataFrame(spark.sparkContext.parallelize(data),StructType(schemaOrig))
sourceDf.createOrReplaceTempView("sourceTable")
sourceDf.unpersist()
现在,如果我尝试查询临时表并希望它重新计算整个RDD世系。
spark.sql("select * from sourceTable").show
[Stage 0:> (0 + 0) /
+---+--------------------+------+
|key| txn_ts|txn_dt|
+---+--------------------+------+
| 1|2020-05-11 15:17:...| 2020|
+---+--------------------+------+
现在我做一个dataframe.show看看是否再次重新计算
scala> sourceDf.show
[Stage 2:> (0 + 0) / 1]
+---+--------------------+------+
|key| txn_ts|txn_dt|
+---+--------------------+------+
| 1|2020-05-11 15:17:...| 2020|
+---+--------------------+------+
现在尝试取消持久化数据框并立即调用节目。因为unpersist被称为,它应该重新计算,但看起来却不是。所以问题是 1)坚持不懈会立即清除内存吗? 2)临时表和数据帧的存储位置是相同还是完全独立?
scala> sourceDf.unpersist
res5: sourceDf.type = [key: string, txn_ts: string ... 1 more field]
scala> sourceDf.show
+---+--------------------+------+
|key| txn_ts|txn_dt|
+---+--------------------+------+
| 1|2020-05-11 15:17:...| 2020|
+---+--------------------+------+