Как создать RDD, выбрав определенные c данные из существующего RDD, где должен выводиться RDD [String]? - PullRequest
2 голосов
/ 08 мая 2020

У меня есть сценарий для захвата некоторых данных (не всех) из существующего RDD, а затем их передачи другому Scala class для реальных операций. Давайте посмотрим с данными примера (empnum, empname, emplocation, empsal) в текстовом файле.

11,John,Paris,1000
12,Daniel,UK,3000 

первый шаг, я создаю RDD с RDD[String] по приведенному ниже коду,

val empRDD = spark
  .sparkContext
  .textFile("empInfo.txt")

Итак, мое требование - создать еще один RDD с empnum, empname, emplocation (снова с RDD[String]). Для этого я пробовал код ниже, поэтому я получаю RDD[String, String, String].

val empReqRDD = empRDD
  .map(a=> a.split(","))
  .map(x=> (x(0), x(1), x(2)))

Я также пробовал с Slice, он дает мне RDD[Array(String)]. Мой требуемый RDD должен быть RDD[String] для перехода к требуемому Scala классу для выполнения некоторых операций.

Ожидаемый результат должен быть:

11,John,Paris
12,Daniel,UK

Может ли кто-нибудь помочь мне, как достичь ?

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Я бы попробовал

val empReqRDD = empRDD
  .map(a=> a.split(","))
  .map(x=> (x(0), x(1), x(2)))

val rddString = empReqRDD.map({case(id,name,city) => "%s,%s,%s".format(id,name,city)}) 
0 голосов
/ 08 мая 2020

В вашей первоначальной реализации вторая карта помещает элементы массива в 3-кортеж, следовательно, RDD [(String, String, String)].

Один из способов достижения sh вашей цели состоит в том, чтобы изменить вторую карту, чтобы построить строку следующим образом:

empRDD
  .map(a=> a.split(","))
  .map(x => s"${x(0)},${x(1)},${x(2)}")

В качестве альтернативы, и немного более кратко, вы могли бы сделать это, взяв первые 3 элемента массива и используя метод mkString:

empRDD.map(_.split(',').take(3).mkString(","))

Вероятно, излишний для этого варианта использования, но вы также можете использовать регулярное выражение для извлечения значений:

val r = "([^,]*),([^,]*),([^,]*).*".r
empRDD.map { case r(id, name, city) => s"$id,$name,$city" }
...