Below is a case class and a companion object with a method putRecord which adds a new row into Hbase using Put API. This code has some repetitive parts. Is there a way to abstract away the repetitive code
case class HbaseRow(_id: Option[String], field1: Option[Array[String]], field2: Option[Array[String]], field3: Option[String], field4: Option[Long])
object HbaseRow {
def putRecord(row: HbaseRow): Put = {
val put = new Put(Bytes.toBytes(row._id.get))
def addColumn[T](columnName: String,value: T): Put = {
val columnFamily:Array[Byte] = Bytes.toBytes("cf")
val col: Array[Byte] = Bytes.toBytes(columnName)
// Repetative, almost same method call but for different types
value match {
case v: String => put.addColumn(columnFamily, col,Bytes.toBytes(v))
case v: Long => put.addColumn(columnFamily, col,Bytes.toBytes(v))
case v: Boolean => put.addColumn(columnFamily, col,Bytes.toBytes(v))
case v: Array[String] => put.addColumn(columnFamily, col,Bytes.toBytes(v.mkString(",")))
}
}
//Repetitive will be tedious as columns increase.
row.field1.map(value => addColumn[Array[String]]("f1",value.mkString(",")))
row.field2.map(value => addColumn[Array[String]]("f2",value.mkString(",")))
row.field3.map(value => addColumn[String]("f3",value))
row.field4.map(value => addColumn[Long]("f4",value))
put
}
}