经过一些复杂的转换后,我将数据集称为缓存。
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个屏幕截图。联合-从内存中读取已计算的数据,联合-从开始算起一个数据集。