2017-05-10 6 views
1
I마다 3 개 요소의 배열을 매핑 할

을 줄이고, 출력이 많은이다 K, V] 쌍, 예를 들어지도 배열

input: array(1,2,3,4,5,6,7,8,9,7,12,11) 
output: (1 => 2,3) (4 => 5,6)(7 => 8,9) (7 => 12,11) 

그리고 또한 키 이러한 쌍을 줄이고 자, 예를 들어 key = 7로 데이터를 수집하려면 출력은 (7=> 8,9,12,11).

고맙습니다.

+0

3 개의 모든 쌍 ('i + = 3')을 반복하기 만하면 좋은 소리가 들리며 멀티 맵을 사용하여 값을 추가하십시오. 일반적으로 키/값 저장소에는 중복 키 값이 없습니다. – Rogue

+5

질문이 있으십니까? "나는 원한다"는 질문이 아닙니다. –

+1

이 질문은 Apache Spark와 어떤 관련이 있습니까? –

답변

3

난 당신이

지도 (4 것

val input = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 7, 12, 11) 
val output = input.toSeq.grouped(3) 
    .map(g => (g.head, g.tail)).toList 
    .groupBy(_._1) 
    .mapValues(l => l.flatMap(_._2)) 

결과 따르고 필요한 생각 -> 목록 (5, 6), (7) -> List (8, 9, 12, 11), 1 -> List (2, 3))

+0

groupped()가있는 것이 좋습니다 – BDR

+0

안녕하세요, 입력 배열이 RDD 파티션 인 경우 다른 파티션에 [k, v] 쌍을 만들어야한다는 것을 의미합니다. 괜찮아? – miaoiao

+0

@miaoiao, 당신이 무엇을하려고하는지 잘 모르겠지만 RDD를 사용하면 달성하기가 정말 어려울 것입니다. RDD는 "Resilient ** Distributed ** Dataset"입니다. 이는 기본적으로 주문 및 노드 간의 분할에 대한 보장이 없음을 의미합니다 (예 : 두 개의 Spark-node간에 4 : 2로 분할 된 6 개 요소 RDD가있을 수 있습니다. 당신의 수술은 그런 분열 후에 아무런 의미가 없다.) 아마도 이전의 단계에서 데이터를 유니폼 목록에 덤프하고 거기에서 그룹화하는 대신 집계해야합니다. – SergGr

1

이 시도 :

res0 = list.grouped(3).map {x => (x(0), List(x(1),x(2)))}.toList 
// you must dump your converted data format into your storage eg hdfs. 
// And not the entire thing in the form of array. Transform in form of 
// (key,value) and dump in hdfs. That will save a lot of computation. 

res1 = sc.parallelize(res0) 
res2 = res1.reduceByKey(_++_).collect 

을하지만이 솔루션이 될 것입니다 얼마나 확장 성이 없습니다 확신합니다.

편집

val res1 = sc.parallelize(arr) 
// (1,2,3,4,5,6,7,8,9,7,12,11) 
val res2 = res1.zipWithIndex.map(x._2/3,List(x._1)) 
// (1,0),(2,1),...(12,10),(11,11) -> (0,1),(0,2),(0,3),(1,4),(1,5),(1,6) 
val res3 = res2.reduceByKey(_++_).map(_._2) 
//(0,List(1,2,3)),(1,List(4,5,6)) -> List(1,2,3),List(4,5,6) 
val res4 = res3.map(x => x match { 
    case x1::xs => (x1,xs) 
}).reduceByKey(_++_) 

//List(1,2,3) - > (1,List(2,3)) -> reduceByKey 
//(1,List(2,3)),(4,List(5,6)),(7,List(8,9,12,11)) 
+0

정말 고마워요! 도와 주셔서 정말 고맙습니다. – miaoiao

+0

안녕하세요, 입력 배열이 RDD의 파티션 인 경우 또 다른 문제가 있습니다. 즉, 파티션 내부에 [k, v] 쌍을 만들어야한다는 것을 의미합니다. – miaoiao

+0

그 전에 내가 [K, V]로 배열을 전처리하는 것에 대한 답변에서 말한 바가 있습니다. –