在缓存中命名Spark DataFrame,并为目录中的缓存表指定StorageLevel

时间:2019-06-13 15:35:41

标签: apache-spark pyspark apache-spark-sql

我如何命名通过以下方式放入缓存的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_ONLYMEMORY_ONLYMEMORY_AND_DISK来验证这一点;并且Spark UI“存储”标签中的“存储级别”始终报告“序列化1x已复制”。

spark.catalog.cacheTable将数据缓存在“反序列化1x复制”中,也可以在Spark UI中进行验证。

0 个答案:

没有答案