Apache Spark: широковещательное соединение не работает для кэшированных данных - PullRequest
0 голосов
/ 09 мая 2018

Когда я соединяю два кадра данных как:

 val secondDf= sparkSession.read.parquet(inputPath)
 joinedDf = firstDf.join(secondDf, Seq("ID"), "left_outer")

Похоже, что Spark выполняет широковещательное соединение, и перетасовки не происходит.

Но как только я кеширую меньший Df:

 val secondDf= sparkSession.read.parquet(inputPath).cache()
 joinedDf = firstDf.join(secondDf, Seq("ID"), "left_outer")

Spark перетасовывает соединение, поэтому, кажется, никакого трансляционного объединения не происходит.

Мой вопрос: почему это происходит? И как я могу избежать перетасовки, когда я кеширую один фрейм данных?

Большое спасибо

1 Ответ

0 голосов
/ 09 мая 2018

Попробуйте

firstDf.join(broadcast(secondDf), Seq....)

Не уверен, почему кэширование должно иметь значение, Spark иногда немного непредсказуем.

Вы можете попробовать записать secondDf на диск и прочитать его обратно вместо кэширования, если оно мало, накладные расходы на это будут минимальными.

...