【问题标题】:How to pass variable arguments to my scala program?如何将变量参数传递给我的 scala 程序?
【发布时间】:2019-07-29 05:01:45
【问题描述】:

我对 scala spark 很陌生。在这里,我有一个字数统计程序,其中我将输入文件作为参数传递,而不是对其进行硬编码并读取它。但是当我运行程序时,我在线程“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。我不知道要对我的程序进行哪些更改,请帮助我,因为我是新手。

【问题讨论】:

  • <your running command> argument1 argument2?我认为你应该使用命令行界面。
  • 这里看起来很标准。

标签: scala apache-spark


【解决方案1】:

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

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

【讨论】:

  • 我尝试了运行配置,但仍然无法获得输出。也许我在传递论点时做错了。您是否可以发送有关如何在运行配置中传递参数的屏幕截图?输入文件类似于 C:\ofajcdnkz\spark scala\input.txt
  • 所以不是直接在脚本中使用路径名,而是将路径名作为参数传递?
  • 是的。更新:我试过了,我能够获得输出。现在我是否将另一个空文本文件作为第二个参数传递,以便将我的输出保存在其中?
  • 传递输出文件的路径,输入输出路径用空格隔开。
  • 所以我在程序参数中运行这两个参数: C:\obr/sparkscala/input_1.txt C:\obr/sparkscala/s.txt 第一个是现有的输入文件,第二个是输出路径但是我得到一个错误:错误执行器:阶段1.0中任务0.0中的异常错误TaskSetManager:阶段1.0中的任务0失败1次;中止工作
【解决方案2】:

您似乎在 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 解析库。

希望这能解决您的问题!

【讨论】:

  • 感谢您的回答。是的,我在窗户上。我将输入文件作为参数传递没有问题,但我的第二个参数是保存我的输出文件。当我传递第二个路径(一个 txt 文件)作为我的第二个参数时,我无法获得所需的输出
  • 很抱歉没有仔细阅读这个问题。 spark-submit --class com.obrigado.MyMain the.jar path/to/inputfile path/to/outputfileargs[1] 的值应该是 path/to/outputfile
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-06
  • 2014-11-30
  • 1970-01-01
  • 1970-01-01
  • 2018-09-09
相关资源
最近更新 更多