Отобразить каждый элемент списка в Spark

Я работаю с СДР, пары которых структурированы следующим образом: [Int, List[Int]] моя цель - сопоставить элементы списка каждой пары с ключом. Так, например, мне нужно сделать это:

RDD1:[Int, List[Int]]
<1><[2, 3]>
<2><[3, 5, 8]>

RDD2:[Int, Int]
<1><2>
<1><3>
<2><3>
<2><5>
<2><8>

ну, я не могу понять, какое преобразование потребуется для того, чтобы добраться до RDD2. Список трансформаций можно найти здесь. Любая идея? Это неправильный подход?

1 ответ

Решение

Ты можешь использовать flatMap:

 val rdd1 = sc.parallelize(Seq((1, List(2, 3)), (2, List(3, 5, 8))))
 val rdd2 = rdd1.flatMap(x => x._2.map(y => (x._1, y)))

 // or:
 val rdd2 = rdd1.flatMap{case (key, list) => list.map(nr => (key, nr))}

 // print result:
 rdd2.collect().foreach(println)

Дает результат:

(1,2)
(1,3)
(2,3)
(2,5)
(2,8)

flatMap создал несколько выходных объектов из одного входного объекта.

В вашем случае внутренняя карта в flatMap отображает кортеж (Int, List[Int]) на List[(Int, Int)] - ключ такой же, как и у входного кортежа, но для каждого элемента во входном списке он создает один выходной кортеж. flatMap приводит к тому, что каждый элемент этого списка становится одной строкой в ​​СДР

Другие вопросы по тегам