方法一: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的几种方式的更多相关文章

  1. Spark WordCount的两种方式

    Spark WordCount的两种方式. 语言:Java 工具:Idea 项目:Java Maven pom.xml如下: <properties> <spark.version& ...

  2. Spark读写Hbase的二种方式对比

    作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 一.传统方式 这种方式就是常用的TableInputFormat和TableOutputForm ...

  3. spark DataFrame的创建几种方式和存储

    一. 从Spark2.0以上版本开始,Spark使用全新的SparkSession接口替代Spark1.6中的SQLContext及HiveContext接口来实现其对数据加载.转换.处理等功能.Sp ...

  4. Spark入Hbase的四种方式效率对比

    一.方式介绍 本次测试一种采用了四种方式进行了对比,分别是:1.在RDD内部调用java API.2.调用saveAsNewAPIHadoopDataset()接口.3.saveAsHadoopDat ...

  5. Spark配置参数的三种方式

    1.Spark 属性Spark应用程序的运行是通过外部参数来控制的,参数的设置正确与否,好与坏会直接影响应用程序的性能,也就影响我们整个集群的性能.参数控制有以下方式:(1)直接设置在SparkCon ...

  6. spark application提交应用的两种方式

    bin/spark-submit --help ... ... --deploy-mode DEPLOY_MODE   Whether to launch the driver program loc ...

  7. Spark部署三种方式介绍:YARN模式、Standalone模式、HA模式

    参考自:Spark部署三种方式介绍:YARN模式.Standalone模式.HA模式http://www.aboutyun.com/forum.php?mod=viewthread&tid=7 ...

  8. UserView--第二种方式(避免第一种方式Set饱和),基于Spark算子的java代码实现

      UserView--第二种方式(避免第一种方式Set饱和),基于Spark算子的java代码实现   测试数据 java代码 package com.hzf.spark.study; import ...

  9. UserView--第一种方式set去重,基于Spark算子的java代码实现

    UserView--第一种方式set去重,基于Spark算子的java代码实现 测试数据 java代码 package com.hzf.spark.study; import java.util.Ha ...

随机推荐

  1. Day7-微信小程序实战-天气预报小程序

    前段时间在B站跟着一个视频,搞天气预报小程序 https://www.bilibili.com/video/BV1cJ411879s 但是因为这个调用的接口要money,太贵了就没买,就只是做了一些不 ...

  2. .NET 5 尝鲜 - 开源项目TerminalMACS WPF管理端支持.NET 5

    .NET 5 尝鲜 - 开源项目TerminalMACS WPF管理端支持.NET 5 一个使用 Prism 作为模块化框架.基于多个开源控件库作为UI控件选择.集成开源 UI 界面设计的 .NET ...

  3. springboot 2.X 集成redis

    在实际开发中,经常会引入redis中间件做缓存,这里介绍springboot2.X后如何配置redis 1 Maven中引入redis springboot官方通过spring-boot-autoco ...

  4. new jup在新一代中存在

    1.灰度发布服务动态路由 动态配置路由规则,实现对调用流量的精确控制.可配置基于版本.IP.自定义标签等复杂的规则.2.服务鉴权示例2需求:服务 provider-demo 只允许来自 consume ...

  5. 网易java高级开发课程 面对上亿数据量,网易用啥技术?

  6. linux网络编程-posix条件变量(40)

    举一个列子来说明条件变量: 假设有两个线程同时访问全局变量n,初始化值是0, 一个线程进入临界区,进行互斥操作,线程当n大于0的时候才执行下面的操作,如果n不大于0,该线程就一直等待. 另外一个线程也 ...

  7. 用Python进行实时计算——PyFlink快速入门

    Flink 1.9.0及更高版本支持Python,也就是PyFlink. 在最新版本的Flink 1.10中,PyFlink支持Python用户定义的函数,使您能够在Table API和SQL中注册和 ...

  8. Docker部署Python项目

    简介 软件开发最大的麻烦事之一就是环境配置,操作系统设置,各种库和组件的安装.只有它们都正确,软件才能运行.如果从一种操作系统里面运行另一种操作系统,通常我们采取的策略就是引入虚拟机,比如在 Wind ...

  9. 入门大数据---HDFS,Zookeeper,ZookeeperFailOverController(简称:ZKFC),JournalNode是什么?

    HDFS介绍: 简述: Hadoop Distributed File System(HDFS)是一种分布式文件系统,设计用于在商用硬件上运行.它与现有的分布式文件系统有许多相似之处.但是,与其他分布 ...

  10. Java 反射简介

    本文部分内容参考博客.点击链接可以查看原文. 1. 反射的概念 反射是指在运行时将类的属性.构造函数和方法等元素动态地映射成一个个对象.通过这些对象我们可以动态地生成对象实例,调用类的方法和更改类的属 ...