Искра: правильный способ удалить последний элемент СДР [Строка] - PullRequest
0 голосов
/ 19 мая 2018

Я пытаюсь удалить последний элемент RDD [String].

Пока я делаю это:

val n: Long = rdd.count()
val startIndex: Long = n - 1

val lastElem = rdd.zipWithIndex()
  .filter{ case (_, index) => index >= startIndex }
  .keys
  .collect()

val newRdd = rdd.filter(x => !x.equalsIgnoreCase(lastElem(0))).cache()

То есть берём последний элемент rdd и фильтруем его, чтобы получить все элементы, кроме последнего.

Это работает хорошо, но есть ли лучший способ сделать это?

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Предполагая, что порядок хорошо определен (нет широких преобразований в восходящем направлении, а входной источник гарантирует четко определенный порядок элементов), ваше текущее решение так же хорошо, как и оно.

Особенно следует избегать не масштабируемых ив целом бесполезен (если порядок значений в СДР не определен должным образом, значение порядка в collected Array также не определено должным образом.) collect.

Перед использованием, пожалуйста, обязательно ознакомьтесь сограничение. Цитирование документов :

Обратите внимание, что некоторые RDD, такие как возвращенные groupBy (), не гарантируют порядок элементов в разделе.Поэтому уникальный идентификатор, назначенный каждому элементу, не гарантируется и может даже измениться, если СДР будет переоценен.Если для обеспечения одинаковых назначений индексов требуется фиксированный порядок, следует отсортировать СДР с помощью sortByKey () или сохранить его в файл.

0 голосов
/ 19 мая 2018

В scala есть функция init, которая дает вам все элементы, кроме последнего в коллекции .Вы можете использовать этот

val newRdd = sc.parallelize(rdd.collect().toList.init)

, что даст вам новый rdd, удалив последний элемент , и это лучше, чем ваш подход, так как метод сбора используется только один раз.

И rdd распространяется, и невозможно определить, какая из них является последней строкой, не собирая ее в один узел.

Здесь Я собрал ее в узел драйвера . Вы можете использовать другую технику, чтобы собрать одного исполнителя и использовать init function

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