2014-08-27 81 views
1

我是新來的scala,我有一個要求重構/模塊化我的代碼。斯卡拉案例類模塊化

我的代碼看起來像這樣,

case class dim1(col1: String,col2: Int,col3) 

val dim1 = sc.textFile("s3n://dim1").map { row => 
val parts = row.split("\t") 
dim1(parts(0),parts(1).toInt,parts(2)) } 

case class dim2(col1: String,col2: Int) 

val dim1 = sc.textFile("s3n://dim1").map { row => 
val parts = row.split("\t") 
dim2(parts(0),parts(1).toInt) } 

case class dim3(col1: String,col2: Int,col3: String,col4: Int) 

val dim1 = sc.textFile("s3n://dim1").map { row => 
val parts = row.split("\t") 
dim3(parts(0),parts(1).toInt,parts(2),parts(3).toInt) } 

case class dim4(col1: String,col2: String,col3: Int) 

val dim1 = sc.textFile("s3n://dim1").map { row => 
val parts = row.split("\t") 
dim4(parts(0),parts(1),parts(2).toInt) } 

這是ETL SCALA變換在Apache星火運行的代碼。

下面是我的步驟,

  1. 定義測試用例類的每一個層面。
  2. 從S3讀取文件並將其映射到相應的案例類。如果需要,我還需要更改數據類型。

這些步驟是高度重複,我想編寫一個函數,

readAndMap(datasetlocation: String,caseclassnametomap: String) 

有了這個我的代碼將成爲,

readAndMap("s3n://dim1",dim1) 
readAndMap("s3n://dim2",dim2) 
readAndMap("s3n://dim3",dim3) 
readAndMap("s3n://dim4",dim4) 

一些例子/方向將高度讚賞

謝謝

+0

類名應該在'CapitalizedCamelCase'中。 – 2014-08-28 09:33:50

回答

1

你可以做這樣的事情,

def readAndMap[A](datasetLocation: String)(createA: List[String] => A) = { 
    sc.textFile(datasetLocation).map { row => 
    createA(row.split("\t").toList) 
    } 
} 

您可以致電此類似

readAndMap[dim1]("s3n://dim1"){ parts => dim1(parts(0),parts(1).toInt,parts(2)) } 
readAndMap[dim2]("s3n://dim2"){ parts => dim2(parts(0),parts(1).toInt) } 
readAndMap[dim3]("s3n://dim3"){ parts => dim3(parts(0),parts(1).toInt,parts(2),parts(3).toInt) } 
readAndMap[dim4]("s3n://dim4"){ parts => dim4(parts(0),parts(1),parts(2).toInt) } 

你不能直接給案件類別和要求的方法來構建一個實例,因爲,案件類的元數申請方法彼此不同。

+0

「你不能直接提供案例類,並要求構造一個實例的方法,因爲案例類應用方法的矩陣彼此不同。」實際上,你可以用反射或宏來實現。不一定是個好主意(雖然可能),但絕對有可能。 – 2014-08-27 13:24:05

+0

Alexey - >如果你能分享一些例子,它會很有幫助。 – user3279189 2014-08-27 13:35:34