Scala_scopt 解析命令行参数

一、说明

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

Scala 中,可以使用 Scopt 库来解析命令行参数Scopt 提供了一些默认的参数解析方法,但是有时候我们需要自定义一些参数的解析方法。下面是一个扩展解析参数的示例: ```scala import scopt.OptionParser case class Config(input: String = "", output: String = "", verbose: Boolean = false) object MyApp { def main(args: Array[String]): Unit = { val parser = new OptionParser[Config]("my-app") { opt[String]("input") .required() .action((value, config) => config.copy(input = value)) .text("input file path") opt[String]("output") .required() .action((value, config) => config.copy(output = value)) .text("output file path") opt[Unit]("verbose") .action((_, config) => config.copy(verbose = true)) .text("enable verbose output") } parser.parse(args, Config()) match { case Some(config) => // 执行你的代码,使用 config.input、config.output、config.verbose 等参数 case None => // 解析失败,输出错误信息 } } } ``` 在上面的示例中,我们定义了一个 Config 类来存储命令行参数的值。然后,我们使用 ScoptOptionParser解析命令行参数。我们定义了三个参数:input、output 和 verbose。其中,input 和 output 是必须的参数,而 verbose 是可选的参数。我们使用 `opt` 方法来定义参数,使用 `action` 方法来指定参数的处理方法。在 `action` 方法中,我们可以使用 `config.copy` 方法来创建一个新的 Config 对象,并更新相应的参数值。最后,我们在 `parser.parse` 方法中解析命令行参数,并根据解析结果执行相应的代码。 需要注意的是,Scopt 提供了很多默认的参数解析方法,例如解析字符串、数字、布尔值等。如果你需要自定义一些特殊类型的参数解析方法,可以使用 `opt[类型]` 方法来定义参数,并使用 `action` 方法来指定参数的处理方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郝少

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值