如何将变量参数传递给我的 scala 程序?

问题描述 投票:0回答:3

我对 scala Spark 很陌生。这里我有一个字数统计程序,其中我将输入文件作为参数传递,而不是对其进行硬编码和读取。但是当我运行程序时,我收到错误 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException : 0

我想这是因为我没有提到我在主课上所接受的论点,但不知道该怎么做。

我尝试按原样运行程序,并尝试更改运行配置。我不知道如何在我的主类中将文件名(在代码中)作为参数传递

import org.apache.spark.SparkContext
import org.apache.spark.SparkConf
import org.apache.spark.sql.types.{StructType,StructField,StringType};
import org.apache.spark.sql.Row;

object First {
 def main(args : Array[String]): Unit = {
   val filename = args(0)
   val cf = new SparkConf().setAppName("Tutorial").setMaster("local")
   val sc = new SparkContext(cf)
   val input = sc.textFile(filename)
   val w = input.flatMap(line => line.split(" ")).map(word=> 
   (word,1)).reduceByKey(_ + _)
   w.collect.foreach(println)
   w.saveAsTextFile(args(1))
  } 


}

我希望通过在我的主类中传递正确的参数(输入文件并将输出文件保存为参数)来运行该程序。我正在使用 scala eclipse IDE。我不知道我的程序要进行哪些更改,请帮助我,因为我是新人。

scala apache-spark
3个回答
0
投票

在项目的运行配置中,main 旁边有一个名为“(x)=Arguments”的选项,您可以在“程序参数”部分将参数传递给 main。

此外,您可以打印 args.length 以查看执行上述操作后代码实际接收的参数数量。


0
投票

看来您正在 Windows 上运行 Spark,所以我不确定这是否能完全按原样工作,但您绝对可以像任何普通命令行应用程序一样传递参数。唯一的区别是您必须在指定 Spark 相关参数之后传递参数。

例如,JAR 文件名是

the.jar
,主对象是
com.obrigado.MyMain
,那么您可以像这样运行 Spark 提交作业:
spark-submit --class com.obrigado.MyMain the.jar path/to/inputfile
。我相信
args[0]
应该是
path/to/inputfile

但是,与任何命令行程序一样,通常最好使用 POSIX 风格的参数(或至少是命名参数),并且有几个很好的参数。就我个人而言,我喜欢使用 Scallop,因为它易于使用,并且似乎不会干扰 Spark 自己的 CLI 解析库。

希望这能解决您的问题!


0
投票

在 scala 中,如果你想使用 sbt 命令传递参数

语法:

sbt“runMain MainClass 参数”

例如:我的主类名称是BookApp,我想传递书名Physics。然后,

sbt "runMain BookApp Physics"

如果您的主类位于包内,例如:org

sbt "runMain org.BookApp Physics"
© www.soinside.com 2019 - 2024. All rights reserved.