application.conf supports nested structure and list.
JobConfig {
inputPath : "xxx",
outputPath: "xxx"
TaskConfig {
inputPath : "yyy",
outputPath: "yyy"
}
To parse the configs in application.conf file,
import scala.collection.JavaConverters._
val jobConfig = config.getConfig(jobName)
val taskConfig = jobConfig.getConfig(taskName)
val inputList = taskConfig.getStringList("inputPath").asScala
//if application.con doesn't contain the tag, find from java system properties
val prop: Option[String] = Try(job.getString("auth.username")).toOption
.orElse(sys.props.get("spark.cassandra.auth.username"))
2. Parse Cli Arguments
case class Config(foo: Int = -1, configFile: String = null)
trait CliArgParser{
def parseCli(
appClassPath: String,
appHeader: String
) = new OptionParser[CliArgs](appClassPath) {
head(appHeader)
opt[Int]('f', "foo")
.action { (x, c) =>
c.copy(foo = x) } text("foo is an integer property")
opt[String]('c', "configFile")
.action { (x, c) => c.copy(configFile = x) }
.text("configuration file")
}
// parser.parse returns Option[C]
def getCliArgs(args: Array[String], cliDefaultParams: CliArgs = CliArgs()) =
parseCli("appClassPath", "app").parse(args, cliDefaultParams) match {
case Some(c) => c
case None => throw Exception("Invalid CLI args")
}
def main(args: Array[String]) {
val cliArgs: CliArgs = getCliArgs(args)
val config: Config = cliArgs.configFile match {
case c:String => ConfigFactory.parseFile(new java.io.File(c))
case _ => ConfigFactory.load()
}
}
Reference:
https://github.com/typesafehub/config
https://github.com/scopt/scopt
No comments:
Post a Comment