Scala案例类模块化

时间:2014-08-27 09:14:10

标签: scala apache-spark

我是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) }

这是在Apache Spark上运行的ETL SCALA转换代码。

以下是我的步骤,

  1. 为每个维度定义案例类。
  2. 从S3读取文件并将其映射到相应的案例类。如果需要,我还需要更改数据类型。
  3. 这些步骤高度重复,我想编写一个这样的函数,

    readAndMap(datasetlocation: String,caseclassnametomap: String)
    

    这样我的代码就会变成,

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

    一些示例/方向将受到高度赞赏

    由于

1 个答案:

答案 0 :(得分: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) }

你不能直接给case case和ask方法构造一个实例,因为case类的应用方法是不同的。