Сохранение индекса в списке как распределенной коллекции-Spark

У меня есть RDD[(Int, List[Int])], который имеет уникальный целочисленный ключ в каждом разделе. Предположим, что данные секционированы как

Раздел 1 — > (1, List1), (2, List2)

Раздел 2 — > (1, List3), (2, List4)

Поэтому, когда я хотел бы найти значение индекса 1, я хочу иметь

Раздел 1 — > (List1)

Раздел 2 — > (List3)

Но возвращаемый тип должен быть RDD[List(Int)] not Array[List(Int)], что означает, что я все еще хочу распределенную коллекцию по кластеру, не собранному в программу драйвера.

В настоящее время я использую фильтр( случай { (k, v) => k == key} ).карта._(_2) но я знаю, что это не делает поиск, а он ищет последовательно.

Я знаю, что есть метод поиска, но он возвращает и массив не RDD. IndexedRDD также делает то же самое.

Так есть ли способ сделать это в Spark?

1 ответ

  1. Я думаю, что вы могли бы использовать mapPartitionsWithIndex. Вы можете получить раздел интереса от разделителя rdd, и в вашей (Int,Iterator)=>Iteratorфункции вы бы просто возвращали пустой итератор в случаях, когда это не был раздел интереса. Для простоты я бы, вероятно, вернул переданный в iterator в случаях, когда это был правильный раздел, а затем просто использовал RDD.фильтрация для упрощения кода.

    Итераторы, работающие здесь, предположительно ленивы, поэтому на самом деле ваша функция применяется только к номеру секции, а не к извлечению результатов из итератора.