我对 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。我不知道我的程序要进行哪些更改,请帮助我,因为我是新人。
在项目的运行配置中,main 旁边有一个名为“(x)=Arguments”的选项,您可以在“程序参数”部分将参数传递给 main。
此外,您可以打印 args.length 以查看执行上述操作后代码实际接收的参数数量。
看来您正在 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 解析库。
希望这能解决您的问题!
在 scala 中,如果你想使用 sbt 命令传递参数
语法:
sbt“runMain MainClass 参数”
例如:我的主类名称是BookApp,我想传递书名Physics。然后,
sbt "runMain BookApp Physics"
如果您的主类位于包内,例如:org
sbt "runMain org.BookApp Physics"