Как оптимальным образом объединить два огромных набора данных в Scala Spark

#scala #dataframe #apache-spark #apache-spark-sql

#scala #фрейм данных #apache-spark #apache-spark-sql

Вопрос:

У меня очень огромный набор данных, для которого мне нужно выполнить объединение, чтобы обогатить его дополнительными столбцами. Набор данных A содержит структуру:- origin|destination|segment1_origin|segment2_origin|segment3_origin|segment4_origin|segment5_origin|segment6_origin|segment1_destination|segment2_destination|segment3_destination|segment4_destination|segment5_destination|segment6_destination

и содержит около 5 миллиардов строк

Набор данных B содержит структуру:- origin|destination|stops|route

Набор данных B фактически содержит информацию о каждом сегменте в наборе данных A и почти в 6 раз превышает размер набора данных A

Для того, чтобы обогатить детали остановки и маршрута, я сейчас делаю:-

 for (x <- 1 to 6){
    DatasetB.withColumnRenamed("stops", s"segment${x}_stops").withColumnRenamed("route", s"segment${x}_route")
    DatasetA.join(DatasetB, (col(s"segment${x}departure") === col("origin"))
            amp;amp; (col(s"segment${x}Arrival") === col("destination")), "left").drop("origin", "destination")
}
 

И это решение работает нормально. Но меня беспокоит то, что я присоединяюсь к нему 6 раз. Мне просто было любопытно узнать, есть ли какой-нибудь способ оптимизировать это? Это вызывает асимметрию, и на более поздних этапах работа замедляется.

Есть ли способ в Scala / Spark dataframe написать это лучше?

Ответ №1:

вы можете выполнить spark.sql соединение с or условием, чтобы вам не нужно было их зацикливать. Также, если ваши данные искажены и занимают время на нескольких разделах, вы можете попробовать salting технику, которая увеличит размер данных, но соединения не будут застревать дольше.