Apache spark 持久化数据帧忽略存储级别

Apache spark 持久化数据帧忽略存储级别,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我正在使用spark SQL dataframes,但在坚持以加速以后的计算时遇到了一个问题。具体来说,当调用persist(StorageLevel.MEMORY_AND_DISK)并随后在Spark UI的“Storage”选项卡中进行检查时,我能够看到正在缓存的RDD,但存储级别始终显示内存反序列化1x Replicated,“Size on DISK”列显示所有RDD的0.0 B 我也尝试了内存和磁盘服务器但得到了相同的结果。我很好奇是否有人看到了这一点,或者我在这里做了一些不正确的事情

我正在使用spark SQL dataframes,但在坚持以加速以后的计算时遇到了一个问题。具体来说,当调用
persist(StorageLevel.MEMORY_AND_DISK)
并随后在Spark UI的“Storage”选项卡中进行检查时,我能够看到正在缓存的RDD,但存储级别始终显示
内存反序列化1x Replicated
,“Size on DISK”列显示所有RDD的0.0 B

我也尝试了
内存和磁盘服务器
但得到了相同的结果。我很好奇是否有人看到了这一点,或者我在这里做了一些不正确的事情。查看spark文档,可以发现在数据帧上调用
cache()
persist()
默认存储级别为
MEMORY\u和\u DISK
,并且在SQLContext中使用
cacheTable
方法表示它
将指定的表缓存在内存中。

有关其他信息,我的程序流程的总体框架如下:

// Here computeHeavyMethod is some code that returns a DataFrame
val tableData = computeHeavyMethod().persist(StorageLevel.MEMORY_AND_DISK)
tableData.write.mode(SaveMode.Overwrite).json(outputLocation)
tableData.createOrReplaceTempView(tableName)

spark.sql("Some sql statement that uses the table created above")
说:

内存和磁盘

将RDD作为反序列化的Java对象存储在JVM中。如果RDD没有 放入内存,存储不适合磁盘的分区,然后读取 需要的时候就从那里开始


因此,磁盘存储仅在(存储)内存不足时使用。至少在Spark 2.2.0中,只有当RDD完全溢出到磁盘时,才会显示“磁盘”:

StorageLevel: StorageLevel(disk, 1 replicas); CachedPartitions: 36; 
TotalPartitions: 36; MemorySize: 0.0 B; DiskSize: 3.3 GB
对于部分溢出的RDD,存储级别显示为“内存”:


将这一行移到末尾,然后重试。tableData.write.mode(SaveMode.Overwrite).json(outputLocation)我已经看到了这一点,这很有意义,让我感到不舒服的是“存储级别”列,它总是显示
内存反序列化1x Replicated
;即使数据帧没有溢出到磁盘,我也希望它能显示内存和磁盘或者类似的东西。
StorageLevel: StorageLevel(memory, deserialized, 1 replicas); 
CachedPartitions: 36; TotalPartitions: 36; MemorySize: 3.4 GB; DiskSize: 1158.0 MB