Pyspark работает медленнее, чем Hive

У меня есть 3 фрейма данных df1, df2 и df3. Каждый фрейм данных содержит примерно 3 миллиона строк. df1 и df3 имеет ок. 8 столбцов. df2 имеет только 3 столбца.
(размер исходного текстового файла df1 составляет около 600 МБ)

Выполняемые операции:

  • df_new = df1 left join df2 -> группировать по столбцам df1-> выбрать столбцы df1, сначала (столбцы df2)

  • df_final = df_new внешнее соединение df3

  • df_split1 = df_final отфильтрован с использованием condition1

  • df_split2 = df_final отфильтрован с использованием condition2

  • записать df_split1, df_split2 в одну таблицу после выполнения различных операций с обоими фреймами данных

Весь этот процесс занимает 15 минут в pyspark 1.3.1 со значением раздела по умолчанию = 10, памятью исполнителя = 30 ГБ, памятью драйвера = 10 ГБ, и я использовал cache () везде, где это необходимо.

Но когда я использую запросы к улью, это не занимает 5 минут. Есть ли какая-то конкретная причина, по которой мои операции с фреймами данных выполняются медленно, и есть ли способ улучшить производительность?


person Mohan    schedule 17.04.2016    source источник
comment
Даже думал, что кешируешь. Данные необходимо загрузить в искру, тогда как они уже находятся в улье.   -  person eliasah    schedule 17.04.2016
comment
Как вы описываете свое состояние1 / состояние2?   -  person Reactormonk    schedule 17.04.2016
comment
Означает ли это, что улей быстрее искры?   -  person Mohan    schedule 17.04.2016
comment
Условия: ColX имеет значение NULL, ColY не равно NULL.   -  person Mohan    schedule 17.04.2016
comment
Почему вы используете такую ​​устаревшую версию Spark? Между 1.3 и 1.6 огромная разница в производительности.   -  person zero323    schedule 17.04.2016
comment
Мой работодатель использует эту версию. В ближайшие несколько месяцев обновление невозможно.   -  person Mohan    schedule 19.04.2016


Ответы (1)


Будьте осторожны с использованием JOIN.

JOIN в искре может быть очень дорогим. Особенно, если соединение происходит между двумя фреймами данных. Вы можете избежать дорогостоящих операций, повторно разделив два фрейма данных в одном столбце или используя один и тот же разделитель.

person Zichu Lee    schedule 30.09.2019