Подтвердить что ты не робот

Количество строк в RDD

Я использую искру с java, и у меня есть RDD из 5 миллионов строк. Есть ли разрешение, которое позволяет мне рассчитать количество строк моего RDD. Я пробовал RDD.count(), но это занимает много времени. Я видел, что могу использовать функцию fold. Но я не нашел java-документацию этой функции. Не могли бы вы показать мне, как использовать его или показать мне другое решение, чтобы получить количество строк моего RDD.

Вот мой код:

JavaPairRDD<String, String> lines = getAllCustomers(sc).cache();
    JavaPairRDD<String,String> CFIDNotNull = lines.filter(notNull()).cache();
    JavaPairRDD<String, Tuple2<String, String>> join =lines.join(CFIDNotNull).cache();


    double count_ctid = (double)join.count(); // i want to get the count of these three RDD
    double all = (double)lines.count();
    double count_cfid = all - CFIDNotNull.count();
    System.out.println("********** :"+count_cfid*100/all +"% and now : "+ count_ctid*100/all+"%");

Спасибо.

4b9b3361

Ответ 1

У вас была правильная идея: используйте rdd.count() для подсчета количества строк. Существует не более быстрый способ.

Я думаю, что вопрос, который вы должны задать, , почему rdd.count() настолько медленный?

Ответ заключается в том, что rdd.count() является "действием" — это нетерпеливая операция, потому что она должна вернуть фактическое число. Операции RDD, которые вы выполнили до count(), были "transformations" — они превратили RDD в другую лениво. Фактически преобразования фактически не выполнялись, просто стояли в очереди. Когда вы вызываете count(), вы принудительно выполняете все предыдущие ленивые операции. Входные файлы должны быть загружены сейчас, map() и filter() выполнены, перетасовки выполнены и т.д., Пока, наконец, у нас нет данных и мы можем сказать, сколько строк у него есть.

Обратите внимание, что если вы дважды вызываете count(), все это произойдет дважды. После возврата счетчика все данные будут отброшены! Если вы хотите этого избежать, вызовите cache() на RDD. Тогда второй вызов count() будет быстрым, а также выведенные RDD будут быстрее вычисляться. Однако в этом случае RDD необходимо будет сохранить в памяти (или диске).

Ответ 2

Даниэль объясняет count прав на деньги. Если вы готовы принять приближение, вы можете попробовать метод countApprox(timeout: Long, confidence: Double = 0.95): PartialResult[BoundedDouble] RDD. (Обратите внимание, что это помечено как "Экспериментальное" ).