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