создание пары RDD в Spark с использованием Scala - PullRequest
0 голосов
/ 29 октября 2018

Я новичок в Spark, поэтому мне нужно создать RDD только с двумя элементами.

Array1 = ((1,1)(1,2)(1,3),(2,1),(2,2),(2,3)

когда я выполняю групповую клавишу, вывод будет ((1,(1,2,3)),(2,(1,2,3))

Но мне нужно, чтобы на выходе было всего 2 пары значений с ключом. Я не уверен, как это получить.

Expected Output = ((1,(1,2)),(1,(1,3)),(1(2,3),(2(1,2)),(2,(1,3)),(2,(2,3)))

Значения должны быть напечатаны только один раз. Должно быть только (1,2), а не (2,1) или как (2,3) не (3,4)

Спасибо

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Если я правильно понимаю ваше требование, вы можете использовать groupByKey и flatMapValues, чтобы сгладить 2-combinations сгруппированных значений, как показано ниже:

val rdd = sc.parallelize(Seq(
  (1, 1), (1,  2), (1 ,3), (2, 1), (2, 2), (2, 3)
))

rdd.groupByKey.flatMapValues(_.toList.combinations(2)).
  map{ case (k, v) => (k, (v(0), v(1))) }.
  collect
// res1: Array[(Int, (Int, Int))] =
//   Array((1,(1,2)), (1,(1,3)), (1,(2,3)), (2,(1,2)), (2,(1,3)), (2,(2,3)))
0 голосов
/ 29 октября 2018

Вы можете получить требуемый результат следующим образом:

// Prior to doing the `groupBy`, you have an RDD[(Int, Int)], x, containing:
//   (1,1),(1,2),(1,3),(2,1),(2,2),(2,3)
//
// Can simply map values as below. Result is a RDD[(Int, (Int, Int))].
val x: RDD[(Int, Int)] = sc.parallelize(Seq((1,1),(1,2),(1,3),(2,1),(2,2),(2,3))
val y: RDD[(Int, (Int, Int))] = x.map(t => (t._1, t)) // Map first value in pair tuple to the tuple
y.collect // Get result as an array
// res0: Array[(Int, (Int, Int))] = Array((1,(1,1)), (1,(1,2)), (1,(1,3)), (2,(2,1)), (2,(2,2)), (2,(2,3)))

То есть, результатом является пара RDD, которая связывает ключ (первое значение каждой пары) с парой (как кортеж ). Не используйте groupBy, поскольку & mdash; в этом случае & mdash; оно не даст вам того, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...