使用maven构建一个基于Java的spark应用程序用于统计唐诗三百首中各汉字出现的次数
目的:统计唐诗三百首全集每个汉字出现的次数
软件需求:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.dt.spark</groupId><artifactId>sparkApps</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>sparkApps</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency>
<groupId>jdk.tools</groupId>
<artifactId>jdk.tools</artifactId>
<version>1.8</version>
<scope>system</scope>
<systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>
</dependency>
<dependency><groupId>org.apache.spark</groupId><artifactId>spark-core_2.10</artifactId><version>1.6.0</version></dependency><dependency><groupId>org.apache.spark</groupId><artifactId>spark-sql_2.10</artifactId><version>1.6.0</version></dependency><dependency><groupId>org.apache.spark</groupId><artifactId>spark-hive_2.10</artifactId><version>1.6.0</version></dependency></dependencies><build><sourceDirectory>src/main/java</sourceDirectory><testSourceDirectory>src/main/test</testSourceDirectory><plugins><plugin><artifactId>maven-assembly-plugin</artifactId><configuration><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs><archive><manifest><maniClass></maniClass></manifest></archive></configuration><executions><execution><id>make-assembly</id><phase>package</phase><goals><goal>single</goal></goals></execution></executions></plugin><plugin><groupId>org.codehaus.mojo</groupId><artifactId>exec-maven-plugin</artifactId><version>1.3.1</version><executions><execution><goals><goal>exec</goal></goals></execution></executions><configuration><executable>java</executable><includeProjectDependencies>false</includeProjectDependencies><classpathScope>compile</classpathScope><mainClass>com.dt.spark.SparkApps.WordCount</mainClass></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.6</source><target>1.6</target></configuration></plugin></plugins>
</build>
</project>//完成以后等待自动安装好JAR包即可Eclipse会下载 相关的Jar文件
//关于pom.xml文件的配置,可以通过以下网站(Maven中央仓库信息速查 http://maven.outofmemory.cn/org.apache.spark/)
//搜索并对照修改,如要查找 spark-streaming_2.10 的依赖包的话,可以点击并对应找到。
如果下载更新时出现错误,忽略!
安装好之后在在这个包下面新建一个包,然后在包下面新建一个Java类WordCount1
package com.dt.spark.sparkApps.cores;import java.util.Arrays;
import java.util.List;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.Function;
import org.apache.spark.api.java.function.Function2;
import org.apache.spark.api.java.function.PairFunction;import scala.Tuple2; public final class WordCount1 { public static void main(String[] args) throws Exception { //context ,用于读文件 ,类似于scala的sc //格式为: // JavaSparkContext(master: String, appName: String, sparkHome: String, jars: Array[String], environment: Map[String, String]) /* JavaSparkContext ctx = new JavaSparkContext("yarn-standalone", "JavaWordCount", System.getenv("SPARK_HOME"), JavaSparkContext.jarOfClass(WordCount1.class)); */ SparkConf conf =new SparkConf().setAppName("Spark WordCount written by java").setMaster("local");//本地测试JavaSparkContext ctx=new JavaSparkContext(conf);//也可以使用ctx获取环境变量,例如下面的语句 System.out.println("spark home:"+ctx.getSparkHome()); //一次一行,String类型 ,还有hadoopfile,sequenceFile什么的 ,可以直接用sc.textFile("path") JavaRDD<String> lines = ctx.textFile("D:\\迅雷下载\\唐诗三百首(全集).txt"); //java.lang.String path, int minSplits lines.cache(); //cache,暂时放在缓存中,一般用于哪些可能需要多次使用的RDD,据说这样会减少运行时间 //collect方法,用于将RDD类型转化为java基本类型,如下 List<String> line = lines.collect(); for(String val:line) System.out.println(val); //下面这些也是RDD的常用函数 // lines.collect(); List<String> // lines.union(); javaRDD<String> // lines.top(1); List<String> // lines.count(); long // lines.countByValue(); /** * filter test * 定义一个返回bool类型的函数,spark运行filter的时候会过滤掉那些返回只为false的数据 * String s,中的变量s可以认为就是变量lines(lines可以理解为一系列的String类型数据)的每一条数据 */ JavaRDD<String> contaninsE = lines.filter(new Function<String, Boolean>() { public Boolean call(String s) throws Exception { return (s.contains("they")); } }); System.out.println("--------------next filter's result------------------"); line = contaninsE.collect(); for(String val:line) System.out.println(val); /** * sample test * sample函数使用很简单,用于对数据进行抽样 * 参数为:withReplacement: Boolean, fraction: Double, seed: Int * */ JavaRDD<String> sampletest = lines.sample(false,0.1,5); System.out.println("-------------next sample-------------------"); line = sampletest.collect(); for(String val:line) System.out.println(val); /** * * new FlatMapFunction<String, String>两个string分别代表输入和输出类型 * Override的call方法需要自己实现一个转换的方法,并返回一个Iterable的结构 * * flatmap属于一类非常常用的spark函数,简单的说作用就是将一条rdd数据使用你定义的函数给分解成多条rdd数据 * 例如,当前状态下,lines这个rdd类型的变量中,每一条数据都是一行String,我们现在想把他拆分成1个个的词的话, * 可以这样写 : */ JavaRDD<String> words = lines.flatMap(new FlatMapFunction<String, String>() { public Iterable<String> call(String s) { String[] words=s.split(""); return Arrays.asList(words); } }); /** * map 键值对 ,类似于MR的map方法 * pairFunction<T,K,V>: T:输入类型;K,V:输出键值对 * 需要重写call方法实现转换 */ JavaPairRDD<String, Integer> ones = words.mapToPair(new PairFunction<String, String, Integer>() { public Tuple2<String, Integer> call(String s) { return new Tuple2<String, Integer>(s, 1); } }); /** * reduceByKey方法,类似于MR的reduce * 要求被操作的数据(即下面实例中的ones)是KV键值对形式,该方法会按照key相同的进行聚合,在两两运算 */ JavaPairRDD<String, Integer> counts = ones.reduceByKey(new Function2<Integer, Integer, Integer>() { public Integer call(Integer i1, Integer i2) { //reduce阶段,key相同的value怎么处理的问题 return i1 + i2; } }); //备注:spark也有reduce方法,输入数据是RDD类型就可以,不需要键值对, // reduce方法会对输入进来的所有数据进行两两运算 JavaPairRDD<String,Integer> sort = counts.sortByKey(); System.out.println("----------next sort----------------------"); /** * collect方法其实之前已经出现了多次,该方法用于将spark的RDD类型转化为我们熟知的java常见类型 */ List<Tuple2<String, Integer>> output = sort.collect(); for (Tuple2<?,?> tuple : output) { System.out.println(tuple._1 + ": " + tuple._2()); } /** * 保存函数,数据输出,spark为结果输出提供了很多接口 */ sort.saveAsTextFile("/tmp/spark-tmp/test"); // sort.saveAsNewAPIHadoopFile(); // sort.saveAsHadoopFile(); System.exit(0); }
}
缺点:不能对汉字按照发音排序!后续改进
使用maven构建一个基于Java的spark应用程序用于统计唐诗三百首中各汉字出现的次数相关推荐
- 云效(原RDC)如何构建一个基于Maven的Java项目
最近在将公司的持续集成架构做一个系统的调整,调整过程中受到了RDC团队大量的帮助,所以利用国庆时间写了几篇RDC的分享,希望能让更多的人了解和用好RDC这个产品. 我会把我最近3个月的使用体会分成5个 ...
- 云效(原RDC)如何构建一个基于Composer的PHP项目
最近在将公司的持续集成架构做一个系统的调整,调整过程中受到了RDC团队大量的帮助,所以利用国庆时间写了几篇RDC的分享,希望能让更多的人了解和用好RDC这个产品. 我会把我最近3个月的使用体会分成5个 ...
- RDC如何构建一个基于NodeJS的前后端项目
摘要: 最近在将公司的持续集成架构做一个系统的调整,调整过程中受到了RDC团队大量的帮助,所以利用国庆时间写了几篇RDC的分享,希望能让更多的人了解和用好RDC这个产品. 我会把我最近3个月的使用体会 ...
- 怎么从头开始构建一个基于web浏览器的云游戏平台--前言——带目录
怎么从头开始构建一个基于web浏览器的云游戏平台–前言 今天开一个新坑,公司突然开始涉及云游戏,还要基于web端,区别于现有的大多数云游戏平台,有点类似于在国内搞一个谷歌云游戏的模式,自己本身对云游戏 ...
- 一个基于Java的syslog服务器,大家都来看看啊!
一个基于Java的syslog服务器 前言 前期准备 功能效果图 接收到的数据只能输出到控制台的问题解决方法 具体代码 结语 前言 当时接到要开发syslog功能时,我的表情是这样的- 啥是syslo ...
- 构建meteor应用程序_我如何在一个月内构建一个复杂的文本分析应用程序
构建meteor应用程序 by Jeffrey Flynt 由Jeffrey Flynt 我如何在一个月内构建一个复杂的文本分析应用程序 (How I built a complex text ana ...
- 基于Java语言的安卓程序编程之一环境搭建2
3 Eclipse及其插件的安装 Eclipse可以看成是Java的集成开发环境.基于Java语言的安卓程序编程就是在Eclipse上进行的.Eclipse附带了一个标准的插件集,通过Eclipse可 ...
- 卡路里计算JAVA_pedometer 这是一个基于android平台的软件,用于计算你走路的步数,算出消耗的卡路里,以达到健 238万源代码下载...
详细说明:这是一个基于android平台的软件,用于计算你走路的步数,算出消耗的卡路里,以达到健康的管理.-This is an android platform based software, us ...
- AVR单片机计算器C语言源程序,一个基于AVR单片机的计算器程序.doc
一个基于AVR单片机的计算器程序 #include #include//延时函数的头文件 #include // 中断函数的头文件 #define uint unsigned int #define ...
最新文章
- 黄仁勋从煤气灶下取出最新GPU:7nm全新安培架构,售价20万美元,训练性能顶6张V100...
- 日常生活小技巧 -- win10造字
- kubeadm部署k8s_(Ansible)三分钟部署一套高可用/可扩展的kubeadm集群
- 数据结构入门学习笔记-1
- li 字多出了省略号_文字溢出自动显示省略号css方法 -
- 简明 ASP.NET Core 手册
- diy一个android手机版下载,原神个人自制版
- 信号与系统实验:信号抽样
- .net core json 为null输出_SpringBoot实战(九):标准化json返回值
- 计算机科学技术技术的发展趋势,计算机科学与技术的发展趋势分析
- html5 dat.gui,Dat.gui 使用教程
- BlackBerry上网初体验
- 怎么入门学习Java编程
- 你有一份七夕赚钱指南等待签收
- [usaco6.1.1Postal Vans]
- H3C交换机命名与板卡命名
- mysqldump单个库导出_mysql mysqldump只导出表结构或只导出数据的实现方法
- 织梦图集php,dedecms织梦文章模型增加图集功能教程
- asp毕业设计—— 基于asp+access的网上花店设计与实现(毕业论文+程序源码)——网上花店
- oracle设计初级,oracle 开发设计一些规范经验