一、说明
1、在做spark项目时,在命令行提交任务时,可以利用 --参数名:参数进行动态传参;
2、操作步骤
(1)首先写个表示配置的case class类,里面为每一个参数指定默认值;
(2)Config 配置对象作为参数传递给 action 回调;
(3)解析命令行参数;
二、操作演示
依赖:
<dependency>
<groupId>com.github.scopt</groupId>
<artifactId>scopt_2.11</artifactId>
<version>3.7.0</version>
</dependency>
1、代码
package com.cn
import org.apache.spark.{SparkConf, SparkContext}
import scopt.OptionParser
object Scopt {
case class Config(name: String = "zhangSan", age: Int = 23)
def main(args: Array[String]): Unit = {
val config: Config = new Config()
val parser = new OptionParser[Config]("ScoptTest") {
head("ScoptTest01")
opt[String]("name")
.text("<name>")
.action((x, c) => c.copy(name = x))
opt[Int]("age")
.text("<age>")
.action((x, c) => c.copy(age = x))
help("help").text("prints this usage text")
note(
"""
this is notic
""".stripMargin)
}
parser.parse(args, config) match {
case Some(params) => runProgram(params)
case _ => sys.exit(1)
}
def runProgram(config: Config) {
val conf = new SparkConf().setAppName("scopt").setMaster("local[1]")
val sc = new SparkContext(conf)
sc.setLogLevel("WARN")
println("name is:" + config.name + ",age is:" + config.age)
}
}
}
2、打包演示
(1)命令行不传参数
[root@master bin]# ./spark-submit --master 'local' --class com.cn.Scopt /home/test/spark/sparkLearn-1.0.0.jar
结果:
name is:zhangSan,age is:23
(2)命令行传入一个参数
[root@master bin]# ./spark-submit --master 'local' --class com.cn.Scopt /home/test/spark/sparkLearn-1.0.0.jar --name wangWu
结果:
name is:wangWu,age is:23
(3)命令行传入全参数
[root@master bin]# ./spark-submit --master 'local' --class com.cn.Scopt /home/test/spark/sparkLearn-1.0.0.jar --name wangWu --age 20
结果:
name is:wangWu,age is:20
注意:如果提交命令出现某个参数无法识别(代码又对此参数配置正确),可以将 --此参数 换下位置,比如放到最上面;
(4)使用help查看参数
[root@master bin]# ./spark-submit --master 'local' --class com.cn.Scopt /home/test/spark/sparkLearn-1.0.0.jar --help
结果:
ScoptTest01
Usage: ScoptTest [options]
--name <value> <name>
--age <value> <age>
--help prints this usage text
this is notic