如何将文本文件作为参数scala传递
我希望专门编写我的wordcount程序,这样我就可以在main中将输入文本文件作为参数传递。我对scala非常陌生,所以我不知道如何传递它的细节。我试着在我的主函数中将它直接提到为defmain(args:“C:/Users/rsjadsa/Documents/input.txt”)如何将文本文件作为参数scala传递,scala,apache-spark,Scala,Apache Spark,我希望专门编写我的wordcount程序,这样我就可以在main中将输入文本文件作为参数传递。我对scala非常陌生,所以我不知道如何传递它的细节。我试着在我的主函数中将它直接提到为defmain(args:“C:/Users/rsjadsa/Documents/input.txt”) 我只想将我的文本文件作为参数传递,而不是硬编码,并对其应用相同的wordcount程序。我知道我不熟悉这种语言,所以很抱歉问了一个愚蠢的问题,它将是字符串数组args中的第一个元素,但这取决于你如何运行程序,以及
我只想将我的文本文件作为参数传递,而不是硬编码,并对其应用相同的wordcount程序。我知道我不熟悉这种语言,所以很抱歉问了一个愚蠢的问题,它将是字符串数组
args
中的第一个元素,但这取决于你如何运行程序,以及你想做什么。这只是从命令行参数中读取并分配给变量。如果希望它位于数据帧中,您还需要创建一个模式(您可能应该这样做)
编辑:因为你想用RDD做字数统计,所以我拿出了数据框的东西,因为它让人困惑。此外,您应该在打印到屏幕之前将RDD收集到驱动程序中,否则它可能会做一些疯狂的事情,因为数据仍在执行器中
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext
import org.apache.spark.SparkConf
import sqlContext.implicits._
import org.apache.spark.sql.types.{StructType,StructField,StringType};
import org.apache.spark.sql.Row;
object WordC {
def main(args: Array[String]): Unit = {
// retrieve the filename
val filename = args(0)
val cf = new SparkConf().setAppName("WordCount").setMaster("local")
val sc = new SparkContext(cf)
val inputRDD = sc.textFile(filename)
val wordsRDD = inputRDD.flatMap(line => line.split(" "))
val wordCountRDD = words.map(word => (word, 1)).reduceByKey(_ + _)
wordCountRDD.collect.foreach(println(_))
}
}
然后不管您如何运行该程序,命令行参数都将是C:/Users/rsjadsa/Documents/input.txt就像scala-WordC.scala“C:/Users/rsjadsa/Documents/input.txt”
谢谢。现在让我们假设我想使用这个程序将我的输出文件存储为文本文件,我如何传递一个参数才能做到这一点?@B2A3R9C9A您可以调用wordCountRDD上的saveastextfile
,您可以将输出文件名作为第二个参数传递(这意味着它将位于args(1)
)我建议您阅读&来看看这里已经介绍过的大多数基本问题。因此我将其命名为:wordCountRDD.saveAsTextFile(args(1))在名为目录的运行配置中保存文本文件,但我得到一个错误:错误执行器:阶段3.0中任务0.0中的异常错误任务集管理器:阶段3.0中的任务0失败1次;中止作业错误SparkHadoopWriter:中止作业\u 20190728165722\u 0005。
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext
import org.apache.spark.SparkConf
import sqlContext.implicits._
import org.apache.spark.sql.types.{StructType,StructField,StringType};
import org.apache.spark.sql.Row;
object WordC {
def main(args: Array[String]): Unit = {
// retrieve the filename
val filename = args(0)
val cf = new SparkConf().setAppName("WordCount").setMaster("local")
val sc = new SparkContext(cf)
val inputRDD = sc.textFile(filename)
val wordsRDD = inputRDD.flatMap(line => line.split(" "))
val wordCountRDD = words.map(word => (word, 1)).reduceByKey(_ + _)
wordCountRDD.collect.foreach(println(_))
}
}