2017-11-07 15 views
-1

私は7つの文字列要素を持つRDDを持っています linesData:org.apache.spark.rdd.RDD [(String、String、String、String、String、String、String、String)] 各レコードのステータスとCSrangeの2つの項目を把握する必要があります。マップ内の複数のネストされたケースステートメントをマップします

ロジックのようなものである。この時点で

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 

、私は(後で私が速度を計算行う必要があります7のinsteatdおそらく9要素と、ディスクへのデータの書き込みしたいと思います上記の各ステータスのさまざまな要素による)。

私の最初の問題は次のとおりです。 1.日付の算定方法? RDDレベル(データフレームなし)にとどまる必要があるためです。 2. SCALAでCASE文を実行する方法がわかりません。

サンプルデータ:

(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

私は7つのフィールドの場合クラスを作成し、RDDに[( ...)] RDDをマップ[MyClassの]とタイプを適切にキャストでしょう。日付のJodaTime日付ライブラリーをお勧めします。これにより、コードがわかりやすくなります。

は、2つの機能にマップ抽出状態および範囲内:

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" 
     .... 
    } 
} 

  • I、コードをテストしていません。
  • 例の変数の名前を変更します。
  • JodaTimeの日付とスカラパターンの一致を管理する方法の例を示します。あなたは関数を完成させ、もう一方を定義しなければなりません。
+0

私はScalaを新しくしました。クラスをスパークシェルコードで使用できますか?どうやって? JodaTimeライブラリをspark-shellにインポートする方法はありますか? – Rachel

+0

スパークシェルで作業する必要はありません。 EclipseやIntellijのようなIDEを使うことができます。スパークシェルを使用している場合は、-jars オプションを追加してライブラリをインポートすることができます。 – gasparms

関連する問題