我如何命名通过以下方式放入缓存的Spark DataFrame(df
):
df.persist()
?
OR
如何使用spark.catalog.cacheTable(“ df”)指定放入缓存中的StorageLevel
中的df
?
使用以下方法缓存df
:
df.persist(StorageLevel.DISK_ONLY)
df.count()
将高速缓存中的DataFrame命名为整个物理计划的文本,如df.explain()
所示。但是,我可以指定StorageLevel
。
而:
df.createOrReplaceTempView("df")
spark.catalog.cacheTable("df")
df.count()
缓存中DataFrame的名称只是“内存表df”,在Spark UI或列表[s.name() for s in sc._jsc.sc().getRDDStorageInfo()]
中更容易识别。 (如果需要,可以用df
来命名df_rdd_id = "df_{}".format(df.rdd.id())
并创建视图并以此来缓存表。)但是,我不能指定StorageLevel
。
我尝试将两者混合使用,但以下两种方法均未达到我想要的效果。
以下名称与物理规划中的名称df
相对,但正确的StorageLevel
。
df.createOrReplaceTempView("df")
df.persist(StorageLevel.DISK_ONLY)
df.count()
以下将df命名为“ df”,但得到的StorageLevel错误。
df.createOrReplaceTempView("df")
df.persist(StorageLevel.DISK_ONLY)
spark.catalog.cacheTable("df")
请注意,无论将df
放入缓存中的方法是哪种,都可以从缓存中删除df
。
例如df
缓存有:
df.persist(StorageLevel.DISK_ONLY)
df.count()
可以使用以下方法从缓存中删除:
df.createOrReplaceTempView("df")
spark.catalog.uncacheTable("df")
同样,df
缓存有:
df.createOrReplaceTempView("df")
spark.catalog.cacheTable("df")
可以使用以下方法从缓存中删除:
df.unpersist()
还要注意,在pySpark中,对于persist()
StorageLevel
常量:“所有常量都使用序列化格式”(pySpark 2.2.0 Docs)。我通过将StorageLevel
设置为DISK_ONLY
,MEMORY_ONLY
或MEMORY_AND_DISK
来验证这一点;并且Spark UI“存储”标签中的“存储级别”始终报告“序列化1x已复制”。
spark.catalog.cacheTable
将数据缓存在“反序列化1x复制”中,也可以在Spark UI中进行验证。