Apache Spark:为什么Spark会创建多个阶段来扫描甚至缓存的配置单元表,为什么重新分区也可以解决这个问题?

时间:2019-03-21 17:40:26

标签: apache-spark hive apache-spark-sql

我的问题是:

  1. 为什么spark会创建多个阶段来扫描配置单元表,即使我 已经缓存了数据框?
  2. 为什么在缓存前重新划分数据帧时减少了阶段数?

方案1(sudo代码):

large_source_df.cache, 
small_source1_df.cache, 
small_source2_df.cache
small_source3_df.cache

res1_df = large_source_df.join(broadcast(small_source1_df)).filter(...)
res2_df = large_source_df.join(broadcast(small_source2_df)).filter(...)
res3_df = large_source_df.join(broadcast(small_source3_df)).filter(...)

union_df = res1_df.union(res2_df).union(res3_df).count

在这种情况下,即使已缓存large_source_df,它也会被使用3次,就像对蜂巢表进行了3次扫描一样。 enter image description here

方案2(sudo代码): 如果我更改了代码,并在缓存之间添加了重新分区,

large_source_df.repartition(200, $"userid").cache, 
small_source1_df.cache, 
small_source2_df.cache
small_source3_df.cache

res1_df = large_source_df.join(broadcast(small_source1_df)).filter(...)
res2_df = large_source_df.join(broadcast(small_source2_df)).filter(...)
res3_df = large_source_df.join(broadcast(small_source3_df)).filter(...)

union_df = res1_df.union(res2_df).union(res3_df).count

它只扫描表格一次。 enter image description here

0 个答案:

没有答案