Apache Spark: почему spark создает несколько этапов для сканирования таблицы улья, даже кэшированной, и почему перераспределение может решить эту проблему? - PullRequest
0 голосов
/ 21 марта 2019

Мои вопросы:

  1. зачем спарк создавать несколько этапов для сканирования таблицы улья, хотя я уже кэшировать фрейм данных?
  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 раза. 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

...