Предположим, у меня есть RDD произвольных объектов. Я хочу получить 10-ю (скажем) строку СДР. Как бы я это сделал? Один из способов — использовать rdd.take(n), а затем получить доступ к n-му элементу — объекту, но этот подход медленный, когда n велико.
Как получить n-й ряд Spark RDD?
Ответы (3)
Я не знаю, насколько это эффективно, так как это зависит от текущих и будущих оптимизаций в движке Spark, но вы можете попробовать сделать следующее:
rdd.zipWithIndex.filter(_._2==9).map(_._1).first()
Первая функция преобразует RDD в пару (значение, idx), где idx начинается с 0 и далее. Вторая функция берет элемент с idx==9 (10-й). Третья функция принимает исходное значение. Затем возвращается результат.
Функция first может быть вызвана механизмом выполнения и повлиять на поведение всей обработки. Попробуйте.
В любом случае, если n очень большое, этот метод эффективен тем, что не требует сбора массива из первых n элементов в узле драйвера.
zipWithIndex
требует полного прохода данных для вычисления смещения индекса каждого раздела. Тем не менее, это все еще, вероятно, ваш лучший выбор.
- person Mike Park; 08.01.2015
.first
- это все, что нужно для первой строки... Серьезный вопрос.
- person AlleyOOP; 02.02.2019
Я не проверял это для огромных данных. Но он отлично работает для меня.
Допустим, n=2, я хочу получить доступ ко второму элементу,
data.take(2).drop(1)
n
, так как это приведет к получению первых элементов n
(на которые влияет разделение...) самому коду драйвера... так что это может быть медленным или даже невозможным делать...
- person masu; 29.08.2016
RDD.collect()
и RDD.take(x)
возвращают список, который поддерживает индексацию. Поэтому каждый раз, когда нам нужен элемент в позиции N. Мы можем выполнить любой из следующих двух кодов: RDD.collect()[N-1]
или RDD.take(N)[N-1]
будут работать нормально, когда нам нужен элемент в позиции N.