У меня есть 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
1
Công Anh 4 Июн 2019 в 12:04

2 ответа

Лучший ответ

Я упростил это до стандартных типов 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)

См. Scalafiddle

0
pme 4 Июн 2019 в 09:21

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

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
Gal Naor 4 Июн 2019 в 10:06