Spark WordCount的两种方式。

语言:Java

工具:Idea

项目:Java Maven

pom.xml如下:

<properties>
<spark.version>1.2.0</spark.version>
</properties> <dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.10</artifactId>
<version>${spark.version}</version>
</dependency>
</dependencies>

第一种方式,比较常规的按部就班的

package pairs;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.FlatMapFunction;
import org.apache.spark.api.java.function.Function2;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.api.java.function.VoidFunction;
import scala.Tuple2;
import java.util.Arrays; public class WordCount1 {
public static void main(String[] args) {
SparkConf conf = new SparkConf().setMaster("local").setAppName("wordcount1");
JavaSparkContext sc = new JavaSparkContext(conf); String filename = "D:\\tmp\\words.txt";
JavaRDD<String> input = sc.textFile(filename);
JavaRDD<String> lines = input.flatMap(new FlatMapFunction<String, String>() {
public Iterable<String> call(String s) throws Exception {
return Arrays.asList(s.split(" "));
}
}); //pairs
JavaPairRDD<String,Integer> pairs = lines.mapToPair(new PairFunction<String, String, Integer>() {
public Tuple2<String, Integer> call(String s) throws Exception {
return new Tuple2<String, Integer>(s,1);
}
}); //reduce
JavaPairRDD<String,Integer> counts = pairs.reduceByKey(new Function2<Integer, Integer, Integer>() {
public Integer call(Integer x, Integer y) throws Exception {
return x+y;
}
}); //output
counts.foreach(new VoidFunction<Tuple2<String, Integer>>() {
public void call(Tuple2<String, Integer> tuple2) throws Exception {
System.out.println(tuple2);
}
}); sc.stop(); }
}

代码输出:

(rose,2)
(jack,3)

第二种更为简洁

package pairs;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.FlatMapFunction; import java.util.Arrays;
import java.util.Map; public class WordCount2 { public static void main(String[] args) {
SparkConf conf = new SparkConf().setMaster("local").setAppName("wordcount2");
JavaSparkContext sc = new JavaSparkContext(conf); String filename = "D:\\tmp\\words.txt";
JavaRDD<String> input = sc.textFile(filename);
JavaRDD<String> lines = input.flatMap(new FlatMapFunction<String, String>() {
public Iterable<String> call(String s) throws Exception {
return Arrays.asList(s.split(" "));
}
}); Map<String,Long> result = lines.countByValue();
System.out.println(result); sc.stop();
}
}

代码输出:

{rose=2, jack=3}

通过对比可以发现,第一种方式一直都是转化操作,最后打印的是Tuple2;而第二种方式变成了行动操作,直接输出Map<String,Long>。

具体有什么区别,或者效率上有啥不同,待后续深入学习。

参考资料:

《Spark快速大数据分析》

Spark WordCount的两种方式的更多相关文章

  1. spark-streaming-连接kafka的两种方式

    推荐系统的在线部分往往使用spark-streaming实现,这是一个很重要的环节. 在线流程的实时数据一般是从kafka获取消息到spark streaming spark连接kafka两种方式在面 ...

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

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

  3. Spark实现wordcount的几种方式

    方法一:map + reduceByKey package com.cw.bigdata.spark.wordcount import org.apache.spark.rdd.RDD import ...

  4. Spark:DataFrame批量导入Hbase的两种方式(HFile、Hive)

    Spark处理后的结果数据resultDataFrame可以有多种存储介质,比较常见是存储为文件.关系型数据库,非关系行数据库. 各种方式有各自的特点,对于海量数据而言,如果想要达到实时查询的目的,使 ...

  5. SparkStreaming与Kafka,SparkStreaming接收Kafka数据的两种方式

    SparkStreaming接收Kafka数据的两种方式 SparkStreaming接收数据原理 一.SparkStreaming + Kafka Receiver模式 二.SparkStreami ...

  6. 大数据学习day33----spark13-----1.两种方式管理偏移量并将偏移量写入redis 2. MySQL事务的测试 3.利用MySQL事务实现数据统计的ExactlyOnce(sql语句中出现相同key时如何进行累加(此处时出现相同的单词))4 将数据写入kafka

    1.两种方式管理偏移量并将偏移量写入redis (1)第一种:rdd的形式 一般是使用这种直连的方式,但其缺点是没法调用一些更加高级的api,如窗口操作.如果想更加精确的控制偏移量,就使用这种方式 代 ...

  7. Flume直接对接SaprkStreaming的两种方式

    一.flume对接sparkStreaming的两种方式: Push推送的方式 Poll拉取的方式 第一种Push方式: 代码如下: package cn.itcast.spark.day5 impo ...

  8. sparkStreaming读取kafka的两种方式

    概述 Spark Streaming 支持多种实时输入源数据的读取,其中包括Kafka.flume.socket流等等.除了Kafka以外的实时输入源,由于我们的业务场景没有涉及,在此将不会讨论.本篇 ...

  9. DStream转为DF的两种方式(突破map时元组22的限制)

    在进行Spark Streaming的开发时,我们常常需要将DStream转为DataFrame来进行进一步的处理, 共有两种方式,方式一: val spark = SparkSession.buil ...

随机推荐

  1. 利用SSL-Change Cipher Spec传递信息

    Change Cipher Spec 中文翻译为 更改密码规格. 恢复原有会话的SSL握手过程流程如下: 关于如何用Change Cipher Spec传输数据,可以扩展tcp.payload. tc ...

  2. HTTP高并发调优小记

    tomcat服务层 1.修改server.xml <Connector port="8088" protocol="HTTP/1.1" maxThread ...

  3. java项目发布到linux服务器,tomcat正常启动但没加载项目

    问题描述: java项目发布到linux服务器,一切操作正确,linux命令启动tomcat后,查看日志启动tomcat正常,上传的war包已经解压成功,但是tomcat没加载项目. 解决方法: 1. ...

  4. springMVC的controller

    控制器controller 负责处理DispatcherServlet分发请求,把业务处理层封装成一个model,然后把该model返回给对应的view. @Controller 用于标记在一个类上, ...

  5. Docker-----常见问题

    docker中删除dead状态的容器 其现象如下:docker ps -a docker rm ytn删除时报错如下:解决方法: 先查出其进程,kill掉,在进行删除 查 ,复制上图白底部分,用以下命 ...

  6. C#使用RabbitMQ(转)

      1. 说明 在企业应用系统领域,会面对不同系统之间的通信.集成与整合,尤其当面临异构系统时,这种分布式的调用与通信变得越发重要.其次,系统中一般会有很多对实时性要求不高的但是执行起来比较较耗时的地 ...

  7. TV 丽音(NICAM)功能

    丽音意谓「接近即时的缩扩音频多路广播」 丽音使用数码技术,把电视台发送的两条音频讯号数码化后进行压缩,传送后再在接收机里扩大还原.数码化使用的是14位元 PCM,32千赫采样. 这种广播法可以播出优质 ...

  8. Date——js 获取当前日期到之后一个月30天的日期区间

    var dateList = []; let startDate = new Date(); let endDate = new Date(); endDate.setDate(startDate.g ...

  9. 02使用java脚本向Pxc集群写入数据

    使用java脚本向Pxc集群写入数据 批量写入pxc集群程序 导入mysql驱动包 # 批量插入数据的java脚本 package pxc_demo; import java.sql.Connecti ...

  10. [HASH]MOD运算用户哈希函数

    一.概述 MOD(取模)运算配合质数的特性,可以实现一种简单的哈希算法. 二.基于的定理 在理解如何实现mod哈希前应当了解一些数学的定理: 1.x mod y = z ,实际上是x除以y的余数y的意 ...