使用Spark统计单词计数,即Word Count的思路如下:
- 首先按行拆分单词,每个单词的初始计数为1
- 然后对相同的单词进行合并,并计数累加
- 对结果格式化输出
主要使用map,flatmap,reduceByKey算子进行计算统计,代码如下:
scala
object WordCount {
// 单词分隔符
val delimiter = ","
def main(args: Array[String]): Unit = {
// 据说Spark-3.x可使用SPARK_USER环境变量指定用户名
System.setProperty("user.name", "hdfs")
// yarn-cluster模式时,只能通过spark-submit.sh方式提交
val sparkConf = new SparkConf().setAppName("xuxm-test").setMaster("yarn-cluster")
val sc = SparkContext.getOrCreate(sparkConf)
// 计算WordCount,可用spark.sparkContext代替sc
val file = sc.textFile("/Users/Xxx/input/wc_in.txt")
val words = file.flatMap(line => line.split(delimiter))
val pairs = words.map(word => (word, 1))
// 自动按pairs中每个元祖的第一个元素作为key,第二个元素作为value,a和b参数分别表示要合并的相同key的2个元祖的value
val counts = pairs.reduceByKey((a, b) => a + b)
val wc = counts.map(p => p._1 + ":" + p._2)
// 以上计算过程也可简化为如下形式
// val wc = file.flatMap(_.split(delimiter)).map((_, 1)).reduceByKey(_ + _).map(p => p._1 + ":" + p._2)
wc.collect().foreach(println) // collect结果是一个Array,也可直接foreach打印
// 也可结果保存到文件中
// wc.saveAsTextFile("/Users/Xxx/output/wc_out")
sc.stop()
}
}