Apache Искра: счет против головы (1) .isEmpty - PullRequest
0 голосов
/ 30 января 2020

Для данной искры df я хочу знать, имеет ли определенный столбец нулевое значение или нет. Код, который я имел, был -

if (df.filter(col(colName).isNull).count() > 0) {//throw exception}

Это заняло много времени и вызывалось 2 раза в течение 1 дф, так как я проверял 2 столбца. Каждый раз, когда он вызывался, я видел задание для подсчета, поэтому 2 задания на 1 дф.

Затем я менял код так, чтобы он выглядел так -

if (!df.filter(col(colName).isNull).head(1).isEmpty) {//throw exception}

С этим изменением я Теперь мы видим 4 рабочих места по сравнению с 2-мя рабочими местами ранее, что увеличивает общее время.

Можете ли вы, эксперты, помочь мне понять, почему количество рабочих мест удвоилось? Функция головы должна вызываться только 2 раза.

Спасибо за вашу помощь! N

Обновление: добавлен скриншот, показывающий задания для обоих случаев. Левая сторона показывает ту, которая имеет счет, а правая - голова. Это единственная линия, которая отличается между двумя прогонами.

enter image description here

Ответы [ 2 ]

0 голосов
/ 30 января 2020

dataframe.head(1) делает 2 вещи - 1. Выполняет действие за кадром данных на исполнителях. 2. Собирает 1-ю строку результата от исполнителя (ов) к водителю.

dataframe.count() выполняет 2 действия: 1. Выполняет действие за кадром данных для исполнителя (ов). Если в файле нет преобразования и используется формат паркета, то это в основном сканирование статистики файла (ов). 2. Собирает счет от исполнителя (ов) к водителю.

Исходя из того, что источником данных является файл, в котором хранится статистика и отсутствуют какие-либо преобразования, count () может работать быстрее, чем head.

Я не уверен на 100%, почему существует 2 задания vs 4. Можете ли вы вставить скриншот.

0 голосов
/ 30 января 2020

Трудно сказать, просто ища эту строку кода, но есть одна причина, по которой голова может занять больше времени. head является детерминированным c запросом, если у вас есть sort или order_by в любой части, которая будет запрашивать тасование, чтобы всегда возвращать первую строку. В случае count вам не нужно упорядочивать результат, поэтому нет необходимости тасовать, просто c простой шаг mapreduce. Вероятно, поэтому ваш head может занять больше времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...