我对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。我不知道要对程序进行哪些更改,因为我是新手,请在这里帮助我。
答案 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解析库。
希望这可以解决您的问题!