Apache spark PySpark存储级别默认值冲突?
不明白为什么缓存的DFs(特别是第一个)在Spark UI中根据代码片段显示不同的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 打印(类型
存储级别
打印(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的一个错误行为,正如文档中提到的,它可能被序列化。我认为pysparkdf.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