在 2 个数据帧 Spark 中缓存同一张表两次

Posted

技术标签:

【中文标题】在 2 个数据帧 Spark 中缓存同一张表两次【英文标题】:Cache same table twice in 2 dataframe Spark 【发布时间】:2020-08-31 15:09:18 【问题描述】:

我已经将一个 hive 表缓存到 Spark 中的一个数据帧中。

使用计时器,我在 2 小时后再次安排缓存,并存储到不同的数据帧中。但是这一次,缓存并没有像我预期的那样工作。似乎它没有缓存表,因为我正在监视日志和可用的免费 Ram。

目的 - 我有一个指向缓存数据的静态变量数据框。现在,2小时后,我想刷新缓存,然后将该变量指向这个新缓存,并取消旧缓存。如果第二次缓存失败,我不会重新指向。

下面是我的代码。实际上,代码是在java中,因此它是Dataset而不是Dataframe。

private static Dataset<Row> dataset;
..
..
public void cacheDataset(SparkSession spark)

        String query = "select * from database.table";

        Dataset<Row> localDataset = spark.sql(query);
        localDataset.cache();

        long count = localDataset.count();
        System.out.println("Dataset is Cached. Count = " + count);

        Dataset<Row> previousDataset = dataset;

        this.dataset = localDataset;

        System.out.println("\n\nStarting to unpersist a dataset\n\n");
        try
            previousDataset.unpersist();
        catch (NullPointerException e)
            System.out.println("Received Null pointer Exception. It means it was the first caching");
        

        System.out.println("\n\nUnpersisting completed\n\n");

    

我怎样才能将同一个表再次缓存到不同的数据集/数据帧中(我可以在这里使用双倍内存消耗一段时间),然后将我的变量重新指向新的缓存集,然后删除旧的缓存以释放内存。

【问题讨论】:

AFAIK cache() 是一种转换。这意味着它应该被链接才能工作。尝试Dataset&lt;Row&gt; localDataset = spark.sql(query).cache();,而不是缓存在不同的行 单独一行缓存没问题,这不是转换。 【参考方案1】:

你没有缓存 previousDataset,你缓存了 localDataset。将 previousDataset 视为应用了恒等变换的新数据集。如果您尝试取消持久化 localDataset 它应该可以工作。

【讨论】:

以上是关于在 2 个数据帧 Spark 中缓存同一张表两次的主要内容,如果未能解决你的问题,请参考以下文章

如果我们缓存一个DataSet,然后将同一个DataSet缓存为一张表,Spark会缓存两次数据吗

Laravel Eloquent Eager Loading:加入同一张表两次

加入表两次 - 在同一个表的两个不同列上

mysql加入2个表 - 但必须加入同一个表两次

在 laravel 中多次查找同一张表

加入同一个表两次时分组