значения кортежа для ключа в scala rdd

У меня есть rdd с парой ключ-значение в Scala. Я хочу сформировать rdd таким образом, чтобы он был (key , tuple(values)).

Я пытался использовать карту, но не работал. Если бы это был pyspark, я бы использовал map(lambda x : x[0] , list(x[1:]))

(a,1,2,3,4), (b,4,5,6),(c,1,3) to [a,(1,2,3,4)], [b,(4,5,6)], [c,(1,3)]


person datasure    schedule 20.05.2019    source источник
comment
Возможно, вам нужно только groupByKey.   -  person Luis Miguel Mejía Suárez    schedule 21.05.2019
comment
Это не решает проблему. Пробовал уже   -  person datasure    schedule 21.05.2019
comment
groupByKey будет работать для парных кортежей, а OP имеет 3-, 4-, 5-кортежи.   -  person Krzysztof Atłasik    schedule 21.05.2019
comment
Ах да, извините, не понял в начале. Вы можете попробовать это map { t => val iter = t.productIterator; iter.next() -> iter.toList } Однако это даст вам RDD[(Any, List[Any])], что мне не кажется слишком полезным.   -  person Luis Miguel Mejía Suárez    schedule 21.05.2019
comment
Я пробовал это, но мне нужен вывод, например (a, (1,2,3)) не как (a, список (1,2,3)). Спасибо @LuisMiguelMejíaSuárez   -  person datasure    schedule 21.05.2019
comment
Ответ Кшиштофа - это то, что вам нужно.   -  person Luis Miguel Mejía Suárez    schedule 21.05.2019


Ответы (1)


В Scala кортежи сложно обрабатывать в общем виде (это изменится в Scala 3), поэтому самым простым решением для вас было бы просто создать вспомогательный объект с перегруженной функцией:

object TupleUtil {   
  def splitHead[K,V](t: (K,V,V)): (K,(V,V)) = t._1 -> (t._2, t._3)
  def splitHead[K,V](t: (K,V,V,V)): (K,(V,V,V)) = t._1 -> (t._2, t._3, t._4)
  def splitHead[K,V](t: (K,V,V,V,V)): (K,(V,V,V,V)) = t._1 -> (t._2, t._3, t._4, t._5)
  //etc up to 22
}

Или, если вы можете использовать shapeless, вы можете просто сделать:

import shapeless.syntax.std.tuple._

(t.head, t.tail)

Чтобы использовать его, просто добавьте его в свой build.sbt:

libraryDependencies += "com.chuusai" %% "shapeless" % "2.3.3"
person Krzysztof Atłasik    schedule 20.05.2019
comment
Таким образом, мы не можем динамически обрабатывать значения без использования помощника. Спасибо @Krzysztof Atłasik. - person datasure; 21.05.2019
comment
Если быть точным, это выполнимо (потому что такие библиотеки, как shapeless, делают это), но это настоящее высокое волшебство с программированием на уровне типов. Таким образом, вы должны либо использовать shapeless (который творит чудеса для вас), либо создать помощника;). Scala 3 упростит работу с кортежами, но потребуется некоторое время, прежде чем он будет использоваться в Spark. - person Krzysztof Atłasik; 21.05.2019