2017-11-07 8 views
-1

7 개의 문자열 요소가있는 RDD가 있습니다 linesData : org.apache.spark.rdd.RDD [(문자열, 문자열, 문자열, 문자열, 문자열, 문자열, 문자열, 문자열)] 각 레코드에 대해 Status와 CSrange라는 2 가지 항목을 찾아야합니다. 이 시점에서지도 RDD 작업에서 SCALA 다중 중첩 된 case 문

case when a(6)=0 
    if Date(a(5)) > Date(a(4)) then 
     if Date(a(5)) - Date(a(4)) > 60 days then 
      staus = '60+' 
     else 
      status = 'Curr' 
     endif 
    else 
     status = 'Curr' 
    end 
when (a(6) >=1 and a(6) <=3) then 
     Status = 'In-Forcl' 
when (a(6) >=4 and a(6) <=8) 
    Status = 'Forclosed' 
else 
    Status = 'Unknown' 
end case 


case when (a(1) <640 and a(1) >0) then CSrange = '<640' 
     when (a(1) <650 and a(1)> 579 then CSrange = '640-649' 
     when (a(1) <660 and a(1)> 619 then CSrange = '650-659' 
     when (a(1) <680 and a(1)> 639 then CSrange = '640-649' 
     when (a(1) >789 then CSrange = '680+' 
else  
     CSRange ='Unknown' 
end case 

, 내가 insteatd 7의 아마 9 요소 (나중에 내가 속도를 계산해야합니다으로, 디스크에 데이터를 쓰는 싶습니다

논리는 무엇인가 같다 위의 각 상태를 다양한 요소로 나타냄).

내 첫 번째 문제는 다음과 같습니다. 1. 날짜를 어떻게 처리합니까? RDD 레벨 (데이터 프레임 없음)에 머무를 필요가 있습니다. 2. SCALA에서 CASE 문을 수행하는 방법을 모르겠습니다.

SAMPLE 자료 :

(2017_7_0555,794,Scott,CORNERSTONE,8/1/2017,8/1/2017,0) 
(2017_7_0557,682,Hennepin,LAKE AREA MT,9/1/2017,8/1/2017,0) 
(2017_7_0565,754,Ramsey,GUARANTEED R,6/1/2017,8/1/2017,0) 
(2017_7_0570,645,Hennepin,FAIRWAY INDE,2/1/2015,8/1/2017,5) 
(2017_7_0574,732,Wright,GUARANTEED R,7/1/2017,8/1/2017,0) 
(2017_7_0575,789,Hennepin,GUARANTEED R,8/1/2017,8/1/2017,0) 
(2017_7_0577,662,Hennepin,MIDCOUNTRY,8/1/2017,8/1/2017,0) 
(2017_7_4550,642,Mower,WELLS FARGO,5/1/2017,8/1/2017,0) 
(2017_7_4574,689,Hennepin,RIVER CITY,8/1/2017,8/1/2017,0) 
(2017_7_4584,662,Hennepin,WELLS FARGO,8/1/2017,8/1/2017,0) 
(2017_7_4600,719,Ramsey,PHH HOME LOA,5/1/2017,8/1/2017,0) 
+0

일부는 학교 프로젝트 용이기 때문에. – Rachel

+0

은 데이터 라인으로 구분 되나요? 입력 데이터를 올바르게 포맷 할 수 있습니까? –

+0

예. 입력이 깨끗합니다. – Rachel

답변

0

나는 일곱 개 분야의 경우 클래스를 생성하고 RDD [MyClass에] 캐스트 적절한 유형에 RDD [(,을 ...)]지도한다. 날짜에 대한 JodaTime 데이트 라이브러리를 추천합니다. 이렇게하면 코드를보다 잘 설명 할 수 있습니다.

는 다음 두 가지 기능으로지도 추출물 상태 및 범위 :

myRDD.map(myInstance => (getStatus(myInstance), getRange(myInstance))) 

def getStatus(myInstance: MyClass) : String = { 
    val (_,_,_,_,date4,date5,field6,_) = MyClass.unapply(myInstance).get 
    field6 match { 
     case 0 => { 
      if(date5.isAfter(date4) { 
       if(date4.plusDays(60).isAfter(date5)){ 
        "60+" 
       } else { 
        "Curr" 
       } 
      } 
     } 
     case x if (x >= 1 && x <= 3) => "Forclosed" 
     .... 
    } 
} 

참고 :

  • 나는 코드를 테스트하지 않았습니다.
  • 예제의 변수 이름을 바꿉니다.
  • JodaTime 날짜 및 스칼라 패턴 일치를 관리하는 방법에 대한 예제를 보여줍니다. 함수를 완료하고 다른 함수를 정의해야합니다.
+0

저는 스칼라를 처음 접했고 스파크 셸 코드에서 클래스를 사용할 수 있습니까? 방법? JodaTime 라이브러리를 스파크 - 쉘로 가져 오는 방법은 무엇입니까? – Rachel

+0

스파크 셸에서 작업 할 필요가 없습니다. Eclipse 또는 Intellij와 같은 IDE를 사용하면 도움이 될 것입니다. 스파크 셸을 사용하는 경우 --jars 옵션을 추가하여 라이브러리를 가져올 수 있습니다. – gasparms