Spark实现wordcount的几种方式
方法一:map + reduceByKey
package com.cw.bigdata.spark.wordcount
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
/**
* WordCount实现第一种方式:map + reduceByKey
*
* @author 陈小哥cw
* @date 2020/7/9 9:59
*/
object WordCount1 {
def main(args: Array[String]): Unit = {
val config: SparkConf = new SparkConf().setMaster("local[*]").setAppName("WordCount1")
val sc: SparkContext = new SparkContext(config)
val lines: RDD[String] = sc.textFile("in")
lines.flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect().foreach(println)
}
}
方法二:使用countByValue代替map + reduceByKey
package com.cw.bigdata.spark.wordcount
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
/**
* WordCount实现第二种方式:使用countByValue代替map + reduceByKey
*
* 根据数据集每个元素相同的内容来计数。返回相同内容的元素对应的条数。(不必作用在kv格式上)
* map(value => (value, null)).countByKey()
*
* @author 陈小哥cw
* @date 2020/7/9 10:02
*/
object WordCount2 {
def main(args: Array[String]): Unit = {
val config: SparkConf = new SparkConf().setMaster("local[*]").setAppName("WordCount2")
val sc: SparkContext = new SparkContext(config)
val lines: RDD[String] = sc.textFile("in")
lines.flatMap(_.split(" ")).countByValue().foreach(println)
}
}
方法三:aggregateByKey或者foldByKey
package com.cw.bigdata.spark.wordcount
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.rdd.RDD
/**
* WordCount实现第三种方式:aggregateByKey或者foldByKey
*
* def aggregateByKey[U: ClassTag](zeroValue: U)(seqOp: (U, V) => U,combOp: (U, U) => U): RDD[(K, U)]
* 1.zeroValue:给每一个分区中的每一个key一个初始值;
* 2.seqOp:函数用于在每一个分区中用初始值逐步迭代value;(分区内聚合函数)
* 3.combOp:函数用于合并每个分区中的结果。(分区间聚合函数)
*
* foldByKey相当于aggregateByKey的简化操作,seqop和combop相同
*
*
* @author 陈小哥cw
* @date 2020/7/9 10:08
*/
object WordCount3 {
def main(args: Array[String]): Unit = {
val config: SparkConf = new SparkConf().setMaster("local[*]").setAppName("WordCount3")
val sc: SparkContext = new SparkContext(config)
val lines: RDD[String] = sc.textFile("in")
lines.flatMap(_.split(" ")).map((_, 1)).aggregateByKey(0)(_ + _, _ + _).collect().foreach(println)
lines.flatMap(_.split(" ")).map((_, 1)).foldByKey(0)(_ + _).collect().foreach(println)
}
}
方法四:groupByKey+map
package com.cw.bigdata.spark.wordcount
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.rdd.RDD
/**
* WordCount实现的第四种方式:groupByKey+map
*
* @author 陈小哥cw
* @date 2020/7/9 13:32
*/
object WordCount4 {
def main(args: Array[String]): Unit = {
val config: SparkConf = new SparkConf().setMaster("local[*]").setAppName("WordCount4")
val sc: SparkContext = new SparkContext(config)
val lines: RDD[String] = sc.textFile("in")
val groupByKeyRDD: RDD[(String, Iterable[Int])] = lines.flatMap(_.split(" ")).map((_, 1)).groupByKey()
groupByKeyRDD.map(tuple => {
(tuple._1, tuple._2.sum)
}).collect().foreach(println)
}
}
方法五:Scala原生实现wordcount
package com.cw.bigdata.spark.wordcount
/**
* Scala原生实现wordcount
*
* @author 陈小哥cw
* @date 2020/7/9 14:22
*/
object WordCount5 {
def main(args: Array[String]): Unit = {
val list = List("cw is cool", "wc is beautiful", "andy is beautiful", "mike is cool")
/**
* 第一步,将list中的元素按照分隔符这里是空格拆分,然后展开
* 先map(_.split(" "))将每一个元素按照空格拆分
* 然后flatten展开
* flatmap即为上面两个步骤的整合
*/
val res0 = list.map(_.split(" ")).flatten
val res1 = list.flatMap(_.split(" "))
println("第一步结果")
println(res0)
println(res1)
/**
* 第二步是将拆分后得到的每个单词生成一个元组
* k是单词名称,v任意字符即可这里是1
*/
val res3 = res1.map((_, 1))
println("第二步结果")
println(res3)
/**
* 第三步是根据相同的key合并
*/
val res4 = res3.groupBy(_._1)
println("第三步结果")
println(res4)
/**
* 最后一步是求出groupBy后的每个key对应的value的size大小,即单词出现的个数
*/
val res5 = res4.mapValues(_.size)
println("最后一步结果")
println(res5.toBuffer)
}
}
方法六:combineByKey
package com.cw.bigdata.spark.wordcount
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.rdd.RDD
/**
* WordCount实现的第六种方式:combineByKey
*
* @author 陈小哥cw
* @date 2020/7/9 22:55
*/
object WordCount6 {
def main(args: Array[String]): Unit = {
val config: SparkConf = new SparkConf().setMaster("local[*]").setAppName("combineByKey")
val sc: SparkContext = new SparkContext(config)
val lines: RDD[String] = sc.textFile("in")
val mapRDD: RDD[(String, Int)] = lines.flatMap(_.split(" ")).map((_, 1))
// combineByKey实现wordcount
mapRDD.combineByKey(
x => x,
(x: Int, y: Int) => x + y,
(x: Int, y: Int) => x + y
).collect().foreach(println)
}
}
Spark实现wordcount的几种方式的更多相关文章
- Spark WordCount的两种方式
Spark WordCount的两种方式. 语言:Java 工具:Idea 项目:Java Maven pom.xml如下: <properties> <spark.version& ...
- Spark读写Hbase的二种方式对比
作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 一.传统方式 这种方式就是常用的TableInputFormat和TableOutputForm ...
- spark DataFrame的创建几种方式和存储
一. 从Spark2.0以上版本开始,Spark使用全新的SparkSession接口替代Spark1.6中的SQLContext及HiveContext接口来实现其对数据加载.转换.处理等功能.Sp ...
- Spark入Hbase的四种方式效率对比
一.方式介绍 本次测试一种采用了四种方式进行了对比,分别是:1.在RDD内部调用java API.2.调用saveAsNewAPIHadoopDataset()接口.3.saveAsHadoopDat ...
- Spark配置参数的三种方式
1.Spark 属性Spark应用程序的运行是通过外部参数来控制的,参数的设置正确与否,好与坏会直接影响应用程序的性能,也就影响我们整个集群的性能.参数控制有以下方式:(1)直接设置在SparkCon ...
- spark application提交应用的两种方式
bin/spark-submit --help ... ... --deploy-mode DEPLOY_MODE Whether to launch the driver program loc ...
- Spark部署三种方式介绍:YARN模式、Standalone模式、HA模式
参考自:Spark部署三种方式介绍:YARN模式.Standalone模式.HA模式http://www.aboutyun.com/forum.php?mod=viewthread&tid=7 ...
- UserView--第二种方式(避免第一种方式Set饱和),基于Spark算子的java代码实现
UserView--第二种方式(避免第一种方式Set饱和),基于Spark算子的java代码实现 测试数据 java代码 package com.hzf.spark.study; import ...
- UserView--第一种方式set去重,基于Spark算子的java代码实现
UserView--第一种方式set去重,基于Spark算子的java代码实现 测试数据 java代码 package com.hzf.spark.study; import java.util.Ha ...
随机推荐
- 上海开发票/v电13543443967
关于事项:Iㄋ5一★4З44一★ㄋ9.б7开发票的准备资料必须要公司名称个人的话就用个人名字和身份证去税务柜台申请办理!公司的话要提供公司全称就是营业执照上的名称,纳税人税号,如果是开普通增值税发票的 ...
- Flutter学习笔记(37)--动画曲线Curves 效果
如需转载,请注明出处:Flutter学习笔记(37)--动画曲线Curves 效果
- SourceTree使用详解(连接远程仓库,克隆,拉取,提交,推送,新建/切换/合并分支,冲突解决)
前言: 俗话说的好工欲善其事必先利其器,Git分布式版本控制系统是我们日常开发中不可或缺的.目前市面上比较流行的Git可视化管理工具有SourceTree.Github Desktop.Tortois ...
- 四层发现-UDP发现
udp发现要注意选择一个不常用的端口,如果目标ip在up时目标端口是开放状态,那么不管目标ip是否为up状态,都不会收到任何回应,只有在目标ip为down状态且目标端口为关闭状态,才会返回一个目标不可 ...
- laravel Excel 导入
<?php namespace App\Modules\Live\Http\Controllers; use Illuminate\Http\Request; use Maatwebsite\E ...
- JavaScript图形实例:图形放大镜效果
1. 基本四瓣花型图案 根据四瓣花卉线的参数方程: t= r*(1+sin(12*θ)/5)*(0.5+sin(4*θ)/2); x=t*cos(θ)); y=t*sin(θ)); 编写如下的HTML ...
- python在循环中追加字典
1. 在循环中用append增加key值,最终生成全是key值的list: 2. 在循环中用append增加value值,最终生成全是value值的list: 3. 最后用zip将两个list合并成一 ...
- js基础练习题(1)
1.字符串 视频教程地址: js基础练习题 1.如何连接两个或者两个以上字符串? var cssname = 'box' var num = 1 var html = '<div class=& ...
- oracle数据库插入日期格式字符串给date类型字段
首先执行 alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'; 然后执行insert语句而无需使用to_date函数
- Netty 源码解析(三): Netty 的 Future 和 Promise
今天是猿灯塔“365篇原创计划”第三篇. 接下来的时间灯塔君持续更新Netty系列一共九篇 Netty 源码解析(一): 开始 Netty 源码解析(二): Netty 的 Channel 当前:Ne ...