2014-08-27 150 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