是否可以获取转换的输出(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只缓存几列。这已经缓解了这个问题。
有什么想法吗?
答案 0 :(得分:0)
我认为不可能只缓存一些列,
但这会解决你的问题吗?
DF1 = spark.read()... .groupBy().agg()...
DF3 = DF1.select("col1", transformation(other_cols)).cache()
DF3.write()
DF2 = DF3.select("col1")