Разделить строку RDD и объединить с другим элементом RDD в одном выражении - PullRequest
0 голосов
/ 10 января 2019

Я могу flatMap 2-й элемент СДР, хорошо.

val rdd = sc.parallelize( Seq( (1, "Hello how are you"),
                               (1, "I am fine"),
                               (2, "Yes you are")
                             )
                        )
val rdd2 = rdd.flatMap(x => x._2.split(" "))

Однако я бы хотел добавить x._1 к каждому разделенному элементу x._2 немедленно, чтобы сформировать кортеж (String, Int). По какой-то причине я не могу видеть это - и я не хочу преобразовывать в массив DF и взрываться. Есть идеи?

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Вы можете получить те же результаты в абстракции df (). Проверьте это

  val df = Seq( (1, "Hello how are you"),(1, "I am fine"),(2, "Yes you are")).toDF("a","b")
  df.show(false)
  df.flatMap( r => { val y = r.getString(1).split(" ");  ( 0 until y.size).map( i => (r.getInt(0), y(i))) }).show

Результаты:

+---+-----------------+
|a  |b                |
+---+-----------------+
|1  |Hello how are you|
|1  |I am fine        |
|2  |Yes you are      |
+---+-----------------+

+---+-----+
| _1|   _2|
+---+-----+
|  1|Hello|
|  1|  how|
|  1|  are|
|  1|  you|
|  1|    I|
|  1|   am|
|  1| fine|
|  2|  Yes|
|  2|  you|
|  2|  are|
+---+-----+
0 голосов
/ 10 января 2019

Просто переберите массив (результат разбиения) и добавьте нужное значение:

val rdd = sc.parallelize( Seq( (1, "Hello how are you"),
                               (1, "I am fine"),
                               (2, "Yes you are")
                             )
                        )
val rdd2 = rdd.flatMap(x => x._2.split(" ").map(item => s"${item}+${x._1}"))
...