Трудоемкий метод JavaRDD take () - PullRequest
1 голос
/ 16 апреля 2020

Как бороться с трудоемким методом, предоставляемым JavaRDD - take ()

Instant startInit = Instant.now();
JavaRDD<Foo> fooJavaRDD = listOfFoo.parallize.map(new Foo()).sortBy(a -> a.sortRule(), true, NoPartitions);
Instant stopInit = Instant.now();

Instant startTake = Instant.now();
List<Foo> fooList = fooJavaRDD.take(1);
Instant stopTake = Instant.now();

System.out.println("Init: " + Duration.between(startInit, stopInit).toMillis());
System.out.println("Take: " + Duration.between(startTake, stopTake).toMillis());

Вывод, который я получаю (в миллисекундах):

Init: 417
Take: 1322

Странно, что парализующий, карта и сортировка не так трудоемки, как take ().

Может быть, есть другой способ получить лучший результат из map ()?

1 Ответ

2 голосов
/ 16 апреля 2020

map() на самом деле не запускается, пока в коде не будет вызван take(). клиент Spark достаточно умен, чтобы не вызывать map() до тех пор, пока не потребуются результаты map(), и он не видит, что это происходит до тех пор, пока не будет вызван take(). Если вам нужно время take(), вы можете вызвать repartition() или другой метод, требующий случайного воспроизведения в Spark. Тогда вы получите истинное время take(). Прямо сейчас вы получаете время как map(), так и take(). Это не совсем интуитивно понятно, и я сталкивался с этим много, много раз.

...