第一种方式:
object WordCount {
def main(args: Array[String]): Unit = {
val conf: SparkConf = new SparkConf().setMaster("local").setAppName("WordCount")
/// 创建Spark上下文对象
val sc = new SparkContext(conf)
// 读取文件种的数据
val textRDD: RDD[String] = sc.textFile("in")
// 扁平化, 按照" "来切割
val wordRDD: RDD[String] = textRDD.flatMap {
case x => {
x.split(" ")
}
}
// 转换结构
val mapRDD: RDD[(String, Int)] = wordRDD.map {
case x => {
(x, 1)
}
}
val rdRDD: RDD[(String, Int)] = mapRDD.reduceByKey {
case (x, y) => {
x + y
}
}
//收集遍历
rdRDD.collect().foreach(println)
}
}
输出:
(scala,4)
(spark,3)
(hadoop,1)
(python,1)
(hello,14)
(java,3)
(world,2)
第二种方式:
object WordCount {
def main(args: Array[String]): Unit = {
val conf: SparkConf = new SparkConf().setMaster("local").setAppName("WordCount")
/// 创建Spark上下文对象
val sc = new SparkContext(conf)
// 读取文件种的数据
val textRDD: RDD[String] = sc.textFile("in")
// 扁平化, 按照" "来切割
val wordRDD: RDD[String] = textRDD.flatMap {
case x => {
x.split(" ")
}
}
// 转换结构
val mapRDD: RDD[(String, Int)] = wordRDD.map {
case x => {
(x, 1)
}
}
// 使用groupByKey方法
val gBKRDD: RDD[(String, Iterable[Int])] = mapRDD.groupByKey()
val mVRDD: RDD[(String, Int)] = gBKRDD.mapValues {
case x => {
x.sum
}
}
mVRDD.collect().foreach(println)
}
}
输出为:
(scala,4)
(spark,3)
(hadoop,1)
(python,1)
(hello,14)
(java,3)
(world,2)
第三种方式:
object WordCount {
def main(args: Array[String]): Unit = {
val conf: SparkConf = new SparkConf().setMaster("local").setAppName("WordCount")
/// 创建Spark上下文对象
val sc = new SparkContext(conf)
// 读取文件种的数据
val textRDD: RDD[String] = sc.textFile("in",2)
// 扁平化, 按照" "来切割
val wordRDD: RDD[String] = textRDD.flatMap {
case x => {
x.split(" ")
}
}
// 转换结构
val mapRDD: RDD[(String, Int)] = wordRDD.map {
case x => {
(x, 1)
}
}
// 使用aggregateByKey方法
val aggRDD: RDD[(String, Int)] = mapRDD.aggregateByKey(0)((x,y) => x+y, (x,y)=> x+y)
aggRDD.collect().foreach(println)
}
}
输出为:
(scala,4)
(python,1)
(hello,14)
(java,3)
(world,2)
(spark,3)
(hadoop,1)
第四种方式:
object WordCount {
def main(args: Array[String]): Unit = {
val conf: SparkConf = new SparkConf().setMaster("local").setAppName("WordCount")
/// 创建Spark上下文对象
val sc = new SparkContext(conf)
// 读取文件种的数据
val textRDD: RDD[String] = sc.textFile("in",2)
// 扁平化, 按照" "来切割
val wordRDD: RDD[String] = textRDD.flatMap {
case x => {
x.split(" ")
}
}
// 转换结构
val mapRDD: RDD[(String, Int)] = wordRDD.map {
case x => {
(x, 1)
}
}
// 使用foldByKey方法
val foldRDD: RDD[(String, Int)] = mapRDD.foldByKey(0)((x,y) => x+y)
// 收集遍历
foldRDD.collect().foreach(println)
}
}
输出为:
(scala,4)
(python,1)
(hello,14)
(java,3)
(world,2)
(spark,3)
(hadoop,1)
第五种方式:
第五种比较复杂, 我是因为练习combineByKey方法,才写了这个WordCount。其实可以不用combineByKey方法来写WordCount. 用上面四种方式就可以.
object WordCount {
def main(args: Array[String]): Unit = {
val conf: SparkConf = new SparkConf().setMaster("local").setAppName("WordCount")
/// 创建Spark上下文对象
val sc = new SparkContext(conf)
// 读取文件种的数据
val textRDD: RDD[String] = sc.textFile("in",2)
// 扁平化, 按照" "来切割
val wordRDD: RDD[String] = textRDD.flatMap {
case x => {
x.split(" ")
}
}
// 转换结构
val mapRDD: RDD[(String, Int)] = wordRDD.map {
case x => {
(x, 1)
}
}
// 使用combinByKey方法
val combinRDD: RDD[(String, (Int, Int))] = mapRDD.combineByKey((_, 1), (acc: (Int, Int), v) => (acc._1 + v, acc._2 + 1), (acc1: (Int, Int), acc2: (Int, Int)) => (acc1._1 + acc2._1, acc1._2 + acc2._2))
// 使用mapValues方法
val mvRDD: RDD[(String, Int)] = combinRDD.mapValues {
case x => {
x._1
}
}
// 收集遍历
combinRDD.collect().foreach(println)
mvRDD.collect().foreach(println)
}
}
输出为:
// (scala, (4,4))中的(4,4), 第一个4是表示所有的v值相加, 第二个4表示v值出现的次数
(scala,(4,4))
(python,(1,1))
(hello,(14,14))
(java,(3,3))
(world,(2,2))
(hadoop,(1,1))
(c,(3,3))
(scala,4)
(python,1)
(hello,14)
(java,3)
(world,2)
(hadoop,1)
(c,3)