Количество строк в 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+"%");
Спасибо.
Ответы
Ответ 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. (Обратите внимание, что это помечено как "Экспериментальное" ).