Spark缓存的数据集未在联接中重用

时间:2018-07-12 19:25:13

标签: apache-spark apache-spark-sql databricks

经过一些复杂的转换后,我将数据集称为缓存。

val complexDs = (some joins and transformations).cache
complexDs.count //invoke action and store dataset in memory

然后我定义这样的方法:

def getCountForType(input: Dataset[Row], tp: String):Dataset[Row] = {
input
.groupBy($"column1",$"column2")
.agg(sum(when($"typeColumn" === tp,1).otherwise(0).as("some_column_name"))    }

现在,我通过执行此方法来创建几个新的数据集。

val newDs1 = getCountForType(complexDs, "aType")
val newDs2 = getCountForType(complexDs, "bType")

有趣的部分来了。当我分别对这几个新数据集的每个调用动作时,我立即获得结果,而在SparkUI上,您可以知道内存表扫描中存在...但是当我尝试像这样进行联接时:

val finalDs = newDs1.as("a").join(newDs2.as("b"), $"a.column1" === 
$"b.column1" && $"a.column2" === $"b.column2)

display(finalDs) 

由于执行速度非常慢,并且在SparkUI上,我从高速缓存中读取了一个数据集,而从开始生成了另一个数据集,因此我可以判断出某些错误。任何人都知道发生了什么事吗?

更新

当我尝试(仅出于测试目的)合并newDs1和newDs2时,我发现内存表扫描中有2个,结果是瞬时的。这是DAG的2个屏幕截图。联合-从内存中读取已计算的数据,联合-从开始算起一个数据集。

enter image description here enter image description here

0 个答案:

没有答案