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

时间:2019-07-28 07:24:41

标签: scala apache-spark

我对Scala Spark非常陌生。在这里,我有一个单词计数程序,其中我将输入文件作为参数传递,而不是对其进行硬编码和读取。但是,当我运行程序时,线程“ main”中出现错误Exception 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。我不知道要对程序进行哪些更改,因为我是新手,请在这里帮助我。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

例如,JAR文件名是the.jar,而主要对象是com.obrigado.MyMain,那么您可以运行spark-submit --class com.obrigado.MyMain the.jar path/to/inputfile这样的Spark提交作业。我认为args[0]应该是path/to/inputfile

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

希望这可以解决您的问题!