Как получить n-й ряд Spark RDD?

Предположим, у меня есть RDD произвольных объектов. Я хочу получить 10-ю (скажем) строку СДР. Как бы я это сделал? Один из способов — использовать rdd.take(n), а затем получить доступ к n-му элементу — объекту, но этот подход медленный, когда n велико.


person user1742188    schedule 07.01.2015    source источник
comment
Я считаю, что ответы на этот вопрос также актуальны здесь.   -  person Nick Chammas    schedule 08.01.2015


Ответы (3)


Я не знаю, насколько это эффективно, так как это зависит от текущих и будущих оптимизаций в движке Spark, но вы можете попробовать сделать следующее:

rdd.zipWithIndex.filter(_._2==9).map(_._1).first()

Первая функция преобразует RDD в пару (значение, idx), где idx начинается с 0 и далее. Вторая функция берет элемент с idx==9 (10-й). Третья функция принимает исходное значение. Затем возвращается результат.

Функция first может быть вызвана механизмом выполнения и повлиять на поведение всей обработки. Попробуйте.

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

person Nicola Ferraro    schedule 07.01.2015
comment
К сожалению, zipWithIndex требует полного прохода данных для вычисления смещения индекса каждого раздела. Тем не менее, это все еще, вероятно, ваш лучший выбор. - person Mike Park; 08.01.2015
comment
Я попробовал это, и это медленно. Хорошо, может быть, получить одну строку, но получать несколько строк, по одной за раз, очень медленно - person Jake; 08.11.2017
comment
Почему это так абсурдно сложно? .first - это все, что нужно для первой строки... Серьезный вопрос. - person AlleyOOP; 02.02.2019

Я не проверял это для огромных данных. Но он отлично работает для меня.

Допустим, n=2, я хочу получить доступ ко второму элементу,

   data.take(2).drop(1)
person Jack Daniel    schedule 23.08.2016
comment
Вы не хотите делать это для больших значений n, так как это приведет к получению первых элементов n (на которые влияет разделение...) самому коду драйвера... так что это может быть медленным или даже невозможным делать... - person masu; 29.08.2016
comment
Соглашаться. Есть ли какой-нибудь эффективный способ сделать это? - person Jack Daniel; 30.08.2016
comment
AFAIK: ответ Николы Ферраро выше содержит лучший подход, который у нас есть на данный момент. stackoverflow.com/a/27826498/2846609 - person masu; 30.08.2016

RDD.collect() и RDD.take(x) возвращают список, который поддерживает индексацию. Поэтому каждый раз, когда нам нужен элемент в позиции N. Мы можем выполнить любой из следующих двух кодов: RDD.collect()[N-1] или RDD.take(N)[N-1] будут работать нормально, когда нам нужен элемент в позиции N.

person Neeraj Mehta    schedule 29.03.2019
comment
плохая идея, если вы хотите миллиардную строку. Это переносит весь RDD в головной конец, что почти всегда неправильно. - person vy32; 01.06.2020