Spark:应用多个转换而无需重新计算或缓存

时间:2017-10-27 15:14:44

标签: apache-spark

是否可以获取转换的输出(RDD / Dataframe)并将其提供给两个独立的转换,而无需重新计算第一个转换并且不缓存整个数据集?

长版

考虑一下这个案例。

我有一个非常大的数据集,不适合内存。现在我对它进行一些转换,准备有效处理数据(分组,过滤,排序......):

DATASET --(TF1: transformation with group by, etc)--> DF1
DF1 --(TF2: more_transformations_some_columns)--> output
DF1 --(TF3: more_transformations_other_columns)--> output2

我想知道是否有任何方式(或计划在开发中)告诉Spark,在TF1之后,它必须重用相同的结果(在分区级别,不缓存所有内容!)来同时服务TF2和TF3。

这可以在概念上被想象为每个分区的cache(),当分区被进一步的转换消耗时具有自动unpersist()。

我搜索了很长时间但找不到任何办法。

我的尝试:

DF1 = spark.read()... .groupBy().agg()...
DF2 = DF1.select("col1").cache()  # col1 fits in mem
DF3 = DF1.select("col1", transformation(other_cols)).write()...  # Force evaluation of col1

不幸的是,DF3无法猜测它可以缓存col1。所以显然不可能要求spark只缓存几列。这已经缓解了这个问题。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我认为不可能只缓存一些列,
但这会解决你的问题吗?

DF1 = spark.read()... .groupBy().agg()...
DF3 = DF1.select("col1", transformation(other_cols)).cache()
DF3.write()
DF2 = DF3.select("col1")