前言
Spark参数解析的代码我郁闷了好一阵子,后面终于在快学Scala中看到的这种写法,记录一下。
关键源码
MasterArguments参数解析的时候有这么一段:
private def parse(args: List[String]): Unit = args match { case ("--ip" | "-i") :: value :: tail => Utils.checkHost(value) host = value parse(tail) case ("--host" | "-h") :: value :: tail => Utils.checkHost(value) host = value parse(tail) case ("--port" | "-p") :: IntParam(value) :: tail => port = value parse(tail) case "--webui-port" :: IntParam(value) :: tail => webUiPort = value parse(tail) case ("--properties-file") :: value :: tail => propertiesFile = value parse(tail) case ("--help") :: tail => printUsageAndExit(0) case Nil => // No-op case _ => printUsageAndExit(1) }
这个功能我们其实是知道,就是我们在启动Master的时候会传入类似
-i HOST, --ip HOST 这种参数,然后会解析,但是那个case语法有点奇怪,我把这部分功能单独抽取出来了:
object ParamParser { var tableName:String=_ var memory:String=_ def main(args: Array[String]): Unit = { val list=List("--table","temp.test_table","--memory","4G") parse(list) print(tableName) print(memory) } //实际就是匹配特定的一段 def parse(list:List[String]):Unit= list match { case "--table" :: value :: tail =>{ tableName=value parse(tail) } case "--memory" :: value :: tail=>{ memory=value; } case Nil=> } }
这个语法关键的部分其实是scala中list的模式匹配,
case “–table” :: value :: tail 语义其实就是匹配这种结构
“–table”::接下来的元素::其他元素,tail就是其他的意思,这种结构连到一起就是匹配上的,所以参数里面的写法"–table","temp.test_table"会被匹配上,value则取值就是temp.test_table.
总结
这个地方其实还是对scala的语法上面掌握不够导致的,scala其实里头很多很骚气的写法,学习还需要加深才行!