scala, фильтр RDD - PullRequest
       16

scala, фильтр RDD

1 голос
/ 04 июня 2019

у меня есть val:

val key: RDD[String]= Seq("0000005","0000001","0000007").toRDD

и

val file2: Array[String] = Array(("0000005", 82, 79, 16, 21, 80),
("0000001", 46, 39, 8, 5, 21), 
("0000004", 58, 71, 20, 10, 6),
("0000009", 60, 89 33 18 6),
("0000003", 30, 50, 71, 36, 30),
("0000007", 50, 2, 33, 15, 62))

Я бы хотел отфильтровать в file2 существующий элемент в "ключе"

Я хочу что-то вроде этого:

0000005 82 79 16 21 80
0000001 46 39 8 5 21
0000007 50 2 33 15 62

Ответы [ 2 ]

0 голосов
/ 04 июня 2019

Во-первых, необходимо отобразить file2 для структуры key-> value: (я предполагаю, что все числа в file2 на самом деле являются строками ..):

val file2Map: RDD[(String, Array[String])] = file2.map(value => (value.head, value)).toRDD

Теперь, если вы это сделаете: keys.join (file2Map) .take (10) .foreach (println)

Вывод будет выглядеть примерно так:

(0000005, (0000005, 0000005 82 79 16 21 80)
(0000001, (0000001, 0000001 46 39 8 5 21)
(0000007, (0000001, 0000001 50 2 33 15 62)

И из этого легко получить только второй кортеж из значения.

0 голосов
/ 04 июня 2019

Я упростил это до стандартных Scala типов коллекций:

val keys = Seq("0000005","0000001","0000007")

val all = Seq("0000005 82 79 16 21 80",
"0000001 46 39 8 5 21", 
"0000004 58 71 20 10 6",
"0000009 60 89 33 18 6",
"0000003 30 50 71 36 30",
"0000007 50 2 33 15 62")

Вот функция фильтра, которая выдаст ваш результат:

val filtered = all.map(_.split(" ").toList)
                  .filter{ case x::_ => keys.contains(x) }
                  .map(_.mkString(" "))

println(filtered) // -> List(0000005 82 79 16 21 80, 0000001 46 39 8 5 21, 0000007 50 2 33 15 62)

См. Скала Фидл

...