Apache spark PySpark存储级别默认值冲突?

Apache spark PySpark存储级别默认值冲突?,apache-spark,pyspark,Apache Spark,Pyspark,不明白为什么缓存的DFs(特别是第一个)在Spark UI中根据代码片段显示不同的存储级别 打印(spark.version) 2.4.3 #id 3=>使用df(内存和磁盘)的默认存储级别,并且不确定为什么存储级别没有序列化,因为我使用的是pyspark df=火花点火范围(10) 打印(类型(df)) df.cache().count() 打印(df.storageLevel) #id 15=>使用rdd的默认存储级别(仅限内存),并解释了它被序列化的原因 rdd=df.rdd 打印(类型

不明白为什么缓存的DFs(特别是第一个)在Spark UI中根据代码片段显示不同的
存储级别

打印(spark.version)
2.4.3
#id 3=>使用df(内存和磁盘)的默认存储级别,并且不确定为什么存储级别没有序列化,因为我使用的是pyspark
df=火花点火范围(10)
打印(类型(df))
df.cache().count()
打印(df.storageLevel)
#id 15=>使用rdd的默认存储级别(仅限内存),并解释了它被序列化的原因
rdd=df.rdd
打印(类型(rdd))
rdd.cache().collect()
#id 19=>手动配置为(内存和磁盘),使存储级别序列化
df2=火花范围(100)
从pyspark导入存储级别
打印(类型(df2))
persist(StorageLevel.MEMORY和DISK.count())
打印(df2.storageLevel)
磁盘内存反序列化1x复制
磁盘内存序列化1x复制
根据Spark文档,python对象总是被序列化的,那么为什么第一个df显示反序列化的

注意:在Python中,存储的对象将始终使用Pickle库进行序列化,因此选择序列化级别并不重要。Python中可用的存储级别包括MEMORY_ONLY、MEMORY_ONLY_2、MEMORY_AND_DISK、MEMORY_AND_DISK_2、DISK_ONLY和DISK_ONLY_2。

rdd
的默认存储是
MEMORY\u ONLY
,而
df
的默认存储是
MEMORY\u和磁盘
,所以Spark UI不应该为所有
pyspark
缓存的数据帧显示
序列化的
吗?

发现有趣的事情(可能是一个bug),关注Spark版本2.4.3

在pyspark中,当我们调用时,它将只调用Java函数cache()

在它内部将使用
内存和磁盘进行缓存,然后在中定义为
创建(真、真、假、真、1)
第二个
true
表示反序列化

总之,当您在pyspark中调用cache()时,它将始终在内存和磁盘中创建反序列化对象。这是pyspark的一个错误行为,正如文档中提到的,它可能会被序列化。

发现有趣的事情(可能是一个bug),请关注您的spark版本2.4.3

在pyspark中,当我们调用时,它将只调用Java函数cache()

在它内部将使用
内存和磁盘进行缓存,然后在中定义为
创建(真、真、假、真、1)
第二个
true
表示反序列化


总之,当您在pyspark中调用cache()时,它将始终在内存和磁盘中创建反序列化对象。这是pyspark的一个错误行为,正如文档中提到的,它可能被序列化。

我认为pyspark
df.persist(StorageLevel.MEMORY\u和磁盘)
以序列化的方式存储结果,pyspark不需要
df.persist(StorageLevel.MEMORY\u和磁盘服务器)
。。。这与
df.cache()
不同。。文档中也只提到了df.persist,我认为pyspark的df.persist(StorageLevel.MEMORY\u和磁盘)
以序列化的方式存储结果,你不需要pyspark的df.persist(StorageLevel.MEMORY\u和磁盘服务器)
。。。这与
df.cache()
不同。。文档中还提到了这一点,仅适用于
df。persist

对于我来说,为什么存储级别不同于在显示反序列化的第1个df中接受默认值,然后在显示序列化的第2个df中显式硬编码到
内存和磁盘
。。。使用spark pythonYes时,可能建议指定
内存和磁盘
,您的建议是正确的。但是使用
persist
也会这样做,它将使用
内存和磁盘
缓存df。我不明白为什么存储级别不同于在显示反序列化的第一个df中接受默认值,然后在显示序列化的第二个df中显式硬编码到
内存和磁盘
。。。使用spark pythonYes时,可能建议指定
内存和磁盘
,您的建议是正确的。但是使用
persist
也会这样做,它将使用
内存和磁盘缓存df