如何在Sparklyr中持久化?

时间:2019-05-28 13:00:12

标签: r apache-spark persistence sparklyr

我正在将Sparklyr用于一个项目,并且了解到持久化非常有用。我为此使用sdf_persist,其语法如下(如果我输入错了,请更正我):

data_frame <- sdf_persist(data_frame)

现在,我的内存中已经存储了太多的RDD,所以我需要取消持久性。但是我似乎在Sparklyr中找不到执行此操作的函数。请注意,我已经尝试过:

dplyr::db_drop_table(sc, "data_frame")
dplyr::db_drop_table(sc, data_frame)
unpersist(data_frame)
sdf_unpersist(data_frame)

但是这些都不起作用。

此外,我正在尝试避免使用tbl_cache(在这种情况下,似乎db_drop_table有效),因为sdf_persist似乎在存储级别提供了更多的自由。可能是我在这里错过了如何使用持久性的全景图,在这种情况下,我很乐意学习更多。

1 个答案:

答案 0 :(得分:0)

如果您不关心粒度,那么最简单的解决方案是调用Catalog.clearCache

spark_session(sc) %>% invoke("catalog") %>% invoke("clearCache")

由于sparklyr的间接作用,取消缓存特定对象的过程要简单得多。如果检查sdf_cache返回的对象,您会发现持久化表没有直接公开:

df <- copy_to(sc, iris, memory=FALSE, overwrite=TRUE) %>% sdf_persist()

spark_dataframe(df) %>% 
  invoke("storageLevel") %>% 
  invoke("equals", invoke_static(sc, "org.apache.spark.storage.StorageLevel", "NONE"))
[1] TRUE

这是因为您没有直接获得注册表,而是SELECT * FROM ...之类的子查询的结果。

这意味着您不能简单地致电unpersist

spark_dataframe(df) %>% invoke("unpersist")

就像在官方API之一中一样。

相反,您可以尝试检索源表的名称,例如这样

src_name <- as.character(df$ops$x)

然后调用Catalog.uncacheTable

spark_session(sc) %>% invoke("catalog") %>% invoke("uncacheTable", src_name)

这可能不是最可靠的解决方案,因此请谨慎使用。