не будет, многое порезал
Делаю свой spark партишенер. Это не case class, а обычный class, поэтому добавлены методы сериализации (скопированы из образцового класса, RangePartitioner). После добавления одного поля выявилась проблема. Выяснилось, что init класса может выполняться несколько раз, но и в образце - классе из исходников Spark та же ситуация. Это, конечно, плохо, но пока совета по этому кейсу не прошу
Вторая беда в том, что в методе объекта-компаньона возвращается Map с преобразованными значениями. Использую mapValues, но итератор проходит по каждому значению несколько раз, и излишне инкрементит мутабельную переменную, которую я использую для создания глобального индекса. Сами значения в итоге правильные, и их ровно столько, сколько нужно. Это точно происходит при обращении к полю rangeBounds в любом методе или при расчёте других полей. Помогите понять, почему итератор проходит несколько раз! Или что такое может происходить в Map.mapValues, что их нужно обходить несколько раз? Сериализация может быть с этим связана?
https://scastie.scala-lang.org/c7ljRtXiTOaFl5lObybiHQ
Для этого достаточно заглянуть в сам метод mapValues. Тогда все сразу станет ясно. Возвращается обернутая коллекция, которая каждый раз при дергании ключа вытаскивает из старой и по новой применяет функцию
Благодарю, что взять на замену?
Котлин? А если без шуток - то стоит поработать над навыком чтения исходного кода. Конкретно в этом случае нет ничего мудреного - пары минут достаточно, чтобы понять что происходит внутри него. Вызови обычный map - получишь новую коллекцию с новыми данными на выходе.
если сделаете так, чтобы код компилировался, попробуем помочь
ну, эта комбинация мутабельных и иммутабельных способов несколько сбивает меня с толку
там нет мутабельности
Обсуждают сегодня