2017-01-16 1 views
0

내가 RDD 데이터 세트 아래에있는에 따라 스파크 RDD를 주문하는 방법 :두 개의 열

ABC [G4, G3, G1] 3 
FFF [G5, G4, G3] 3 
CDE [G5,G4,G3,G2] 4 
XYZ [G4, G3] 2 

하는 마지막 COL은 주먹 튜플 항목 내림차순 순서에 의해 순서 같은 경우, 첫 번째 마지막 열 내림차순으로 정렬 할 필요 . 예상 결과는

CDE [G5,G4,G3,G2] 4 
FFF [G5, G4, G3] 3 
ABC [G4, G3, G1] 3 
XYZ [G4, G3] 2 

입니다. 미리 감사드립니다. (배열이다) 번째 열의 첫 번째 요소 위에서

rdd.sortBy(r => (r._3, r._2(0)), false) 

마지막 열의 r._3 스탠드 r._2(0), 그리고 false 그 순서해야 지정

답변

2

sortBy 사용 내려라. 그 정렬은 셔플으로 인해 비싼 작업이지만 염두에 두십시오.

/// Generate data 
val rdd = sc.parallelize(Seq(("ABC","G4"),("ABC","G3"), 
          ("ABC","G1"),("FFF","G5"), 
          ("FFF","G4"),("FFF","G3"), 
          ("CDE","G5"),("CDE","G4"),        
          ("CDE","G3"),("CDE","G2"), 
          ("XYZ","G4"),("XYZ","G3"))) 

/// Put values in a list and calculate its size 
val rdd_new = rdd.groupByKey.mapValues(_.toList).map(x => (x._1, x._2, x._2.size)) 

/// Now this works 
rdd_new.sortBy(r => (r._3, r._2(0)), false).collect() 
/// Array[(String, List[String], Int)] = Array((CDE,List(G5, G4, G3, G2),4), (FFF,List(G5, G4, G3),3), (ABC,List(G4, G3, G1),3), (XYZ,List(G4, G3),2)) 
+0

Mtoto, 시도했지만 결과가 예상대로 정확하지 않습니다. (CDE \t [\t G5, \t G4, \t G3, \t G2], 4) (ABC \t [\t G4, \t G3, \t G1, 3) (FFF \t [\t G5, \t G4, G3], 3) (XYZ \t, [\t G4, \t G2], 2). 그것은 마지막 열 desc에 의해 순서는 바르게 정렬되지만 배열의 첫 번째 항목에서는 올바르지 않습니다. –

+0

안녕하세요, Phoenix/Mtoto, 도움을 주셔서 감사합니다. 나는 스파크에서 정말로 새로운 사람이다. 나는 이것이 다른 과정의 결과라고 제대로 설명했다고 생각합니다. 나는 또 다른 물줄기를 열었다. 아래의 링크를 통해 나를 도와주십시오 : http://stackoverflow.com/questions/41681804/how-to-order-rdd-with-two-columns. 도와 주셔서 감사합니다. –

+0

당신이해야 할 일은 데이터 세트의 재현 가능한 예를 공유하는 것입니다. 링크 된 새로운 질문은 본질적으로이 질문과 같습니다. 문제는 아마도 두 번째 열이 긴 문자열 일 것입니다. 먼저 배열로 변환해야합니다. 그러면 위의 코드가 작동합니다. – mtoto

0

내가 위의 대답은 작동하지 않는 이유는 확실하지 않다 : 우리는 당신이 pair rdd 시작 가정하면

업데이트

여기에 재현 예입니다. 괜찮아 보이는 군.이 코드로 시도해 봐. 작동하는지

(50,array2,i5) 
(20,array3,i4) 
(20,array4,i2) 
(10,array1,i1) 

이 솔루션을 수락 : 여기
val idRDD = sc.textFile(inputPath) 

val idSOrted = idRDD.map { rec => ((rec.split(",")(2),rec.split(",")(0)),(rec.split(",")(1))) }.sortByKey(false).map(rec=>(rec._1._1,rec._2,rec._1._2)) 

는 O/P이다 : 여기 내 입력

i1,array1,10 
i5,array2,50 
i4,array3,20 
i2,array4,20 

코드입니다.