重用数据集的 Spark 持久函数



假设我通过不同的转换(连接、映射等(创建了数据集,并将其保存到 hbase 中的表 A 中。现在我想通过选择特定列将相同的数据集保存到 hbase 中的另一个表中。在这种情况下,我应该在保存到表 A 后使用持久函数吗?或者如果我只使用选择功能,没关系?

例如:

Dataset<Row> ds = //computing dataset by different transformations
//save ds to table A in hbase
ds.persist();
Dataset<Row> ds2 = ds.select(col("X"));
//save ds2 to table B in hbase
Dataset<Row> ds3 = ds.select(col("Y"),col("Z"));
//save ds3 to table C in hbase
ds.unpersist();

Scala 是懒惰的,在这种情况下,这意味着如果您不持久化数据,将为每个操作重做所有转换。因此,如果计算数据集ds

Dataset<Row> ds = //computing dataset by different transformations

需要很长时间,那么持久化数据绝对是有利的。为了获得最佳效果,我建议在第一次保存(保存到table A(之前完成。在此之后完成传输时,所有数据的读取和转换都将完成两次。

请注意,在对数据集和后续数据集执行所有操作之前,不应使用 unpersist()

你可以做

Dataset<Row> ds = //computing dataset by different transformations
ds.persist();    
//save ds to table A in hbase
Dataset<Row> ds2 = ds.select(col("X"));
//save ds2 to table B in hbase
Dataset<Row> ds3 = ds.select(col("Y"),col("Z"));
//save ds3 to table C in hbase
ds.unpersist();

这样,您可以保留所有内容,然后继续将不同的列集保存到不同的表中。

最新更新