awk方式实现词频统计:

方式一:
vi wordcount.awk
{
for (i = 1; i <=NF;i++) //NF 表示的是浏览记录的域的个数
freq[$i]++
}
END{
for(word in freq) //
printf "%s%d\n",word,freq[word] //
}
运行:awk -f wordcount.awk words.txt;
----------------------------------
方式二:
运行方式二:
vi wordcount_awk.sh
#!/bin/sh
awk -F " " '{
for (i = 1; i<=NF; i++)
freq[$i]++
}
END{
for (word in freq)
printf "%s%d\n",word,freq[word]
}' $1 chmod u+x wordcount_awk.sh
./wordcount_awk.sh words.txt
----------------------------- NF 表示的是浏览记录的域的个数
$NF 表示的最后一个Field(列),即输出最后一个字段的内容 [root@localhost SHELL]# free -m | grep buffers\/
-/+ buffers/cache: 1815 1859
[root@localhost SHELL]# free -m | grep buffers\/ | awk '{print $NF}'
1859
[root@localhost SHELL]# free -m | grep buffers\/ | awk '{print NF}'
4
[root@localhost SHELL]#
--------------------------------
%x代表十六进制
%o是八进制
%d或%i代表十进制整数,
%c是字符
%s是字符串,
%f或%e是输入实数,小数或指数输入都可以
%ld是long double型
%%输入一个百分号。

  javaApi方式实现词频统计:

package cn.WordTongJi;

import java.io.*;
import java.util.HashMap;
import java.util.Map; /**
* Created by Administrator on 2018/6/1 0001.
*/
public class WordDemo {
public static void main(String[] args) throws IOException {
//读取文件内容,获取文件对象
BufferedReader br =new BufferedReader(new FileReader("D:\\test\\aaa.txt"));
//根据对象获取单词
String nextLines=""; Map<String,Integer> map = new HashMap<String,Integer>();
while ((nextLines=br.readLine())!=null){
//以空格拆分单词,获取到单词数组
String[] data =nextLines.split(" ");
//将单词放进Map中,利用for循环,遍历
for(String word:data){
//先在循环外定义一个hashmap
//将单词放进map中
//<单词,1>的形式
map.put(word,1);
}
}
//遍历map中的单词
//KeySet():将Map中所有的键存入到set集合中
for(String key:map.keySet()){
//根据key值,计算key值对应的value值
System.out.println(key+"----"+map.get(key));
}
}
}

mapreduce实现词频统计:

package cn.bcqm1711.mr.day01;/**
* Created by Administrator on 2018/5/2.
*/ import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.partition.HashPartitioner; import java.io.IOException; /**
* @author :YongKe.Pan
* @Desc : 自定义词频统计
* @create 2018-05-02 9:44
**/ public class CustomWordCount { //MapTask阶段:默认情况下一个数据块对应一个split分片,一个分片对应一个MapTask
//LongWritable, Text表示的是每一行的偏移量和每一行内容的数据类型
//Text, IntWritable表示的是每一个map输出key/value的数据类型
public static class WCMapper extends Mapper<LongWritable, Text, Text, IntWritable> { private static final IntWritable one = new IntWritable(1);
private Text word = new Text(); //在开始业务代码之前调用一次
@Override
protected void setup(Context context) throws IOException, InterruptedException { } //编写业务逻辑代码,每一行调用一次这个map方法
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
//获取每一行的内容
String line = value.toString();
//拆分行获取单词
String[] words = line.split(" ");
for (String wd : words) {
word.set(wd);
//输出到本地磁盘:<单词,1>
context.write(word, one);
}
} //业务代码执行完成之后,最后调用一次cleanup
@Override
protected void cleanup(Context context) throws IOException, InterruptedException { }
} //ReducerTask阶段
//Text, IntWritable两个参数接收的是mapTask输出的key/value数据类型
//Text, IntWritable ReducerTask阶段对接收到的数据业务处理之后输出到hdfs系统的key/value数据类型
public static class WCReduce extends Reducer<Text, IntWritable, Text, IntWritable> {
//在开始执行Reduce业务代码之前调用一次
@Override
protected void setup(Context context) throws IOException, InterruptedException { } //key的hashcode码相同的被分配到一个Reduce
@Override
protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable v : values) {
sum += v.get();
}
//将聚合之后的单词及次数输出到HDFS
context.write(key, new IntWritable(sum));
} //处理完Reduce业务代码之后用一次
@Override
protected void cleanup(Context context) throws IOException, InterruptedException { }
} //job作业的驱动部分
public static void main(String[] args) throws Exception {
//获取配置对象
Configuration conf = new Configuration();
//CustomWordCount是作业的名称,可以在历史服务器上方便查看
//Job job=new Job();
Job job = Job.getInstance(conf, "CustomWordCount");
//设置程序的入口类
job.setJarByClass(CustomWordCount.class); //封装MapTask阶段
job.setMapperClass(WCMapper.class);//设置map阶段的业务处理代码
job.setMapOutputKeyClass(Text.class);//告诉mr框架map输出key的数据类型
job.setMapOutputValueClass(IntWritable.class);//告诉mr框架,map输出value的数据类型
//接收main方法的参数(在提交运行job时传入的参数:/words3.txt)
FileInputFormat.addInputPath(job,new Path(args[0])); //告诉mr阶段要处理的文件路径 //封装ReduceTask阶段
job.setReducerClass(WCReduce.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
//将数据输出到hdfs系统的哪个文件(/out0502)
FileOutputFormat.setOutputPath(job,new Path(args[1]));
job.setPartitionerClass(HashPartitioner.class); job.setNumReduceTasks(2);
//提交job
boolean isOk = job.waitForCompletion(true);
System.exit(isOk ? 0 : 1);
}
}

scala方式实现词频统计:

package cn.qmScala.day04Scala

/**
* Created by Administrator on 2018/6/2 0002.
*/
object Demo15WordCount {
val acc =true def main(args: Array[String]) {
val data =Array("jin tian tian qi bu cuo xiang chu qu wan ")
//拆分出单词.使用flatMap方法
val words:Array[String]=data.flatMap(_.split(" "))
//单词->(单词,1)的形式
val word_one:Array[(String,Int)]=words.map((_,1))
//分组
val groupByWord:Map[String,Array[(String,Int)]]=word_one.groupBy(_._1)
//1.统计每个单词的个数
val words_times:Map[String,Int]=groupByWord.mapValues(_.size)
//for((k,v)<- words_times)println(s"$k,$v")
//2.按单词出现的次数排序.将单词放进集合中,通过集合的方法来进行排序
val wordsTimesList:List[(String,Int)]=words_times.toList
//val wordCountTimeSort:List[(String,Int)]=wordsTimesList.sortBy(_._2)
val wordCountTimeSort:List[(String,Int)]=wordsTimesList.sortBy(_._2)
// for((k,v)<- wordCountTimeSort)println(s"$k,$v")
//3.求最大的前三个次数最多的单词.....scala的方法
val wordCountTop3=wordCountTimeSort.take(3)
for((k,v)<- wordCountTop3)println(s"$k,$v")
}
}

javaApi,mapreduce,awk,scala四种方式实现词频统计的更多相关文章

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

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

  2. C#批量插入数据到Sqlserver中的四种方式

    我的新书ASP.NET MVC企业级实战预计明年2月份出版,感谢大家关注! 本篇,我将来讲解一下在Sqlserver中批量插入数据. 先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的 ...

  3. 【Java EE 学习 80 下】【调用WebService服务的四种方式】【WebService中的注解】

    不考虑第三方框架,如果只使用JDK提供的API,那么可以使用三种方式调用WebService服务:另外还可以使用Ajax调用WebService服务. 预备工作:开启WebService服务,使用jd ...

  4. ASP.NET MVC之下拉框绑定四种方式(十)

    前言 上两节我们讲了文件上传的问题,关于这个上传的问题还未结束,我也在花时间做做分割大文件处理以及显示进度的问题,到时完成的话再发表,为了不耽误学习MVC其他内容的计划,我们今天开始好好讲讲关于MVC ...

  5. SWT组件添加事件的四种方式

    在我们CS日常开发过程中会经常去为组件添加事件,我们常用的为AWT与SWT.SWT的事件模型是和标准的AWT基本一样的.下面将按照事件的四种写法来实现它. 一.匿名内部类的写法 new MouseAd ...

  6. Java实现文件复制的四种方式

    背景:有很多的Java初学者对于文件复制的操作总是搞不懂,下面我将用4中方式实现指定文件的复制. 实现方式一:使用FileInputStream/FileOutputStream字节流进行文件的复制操 ...

  7. C#_批量插入数据到Sqlserver中的四种方式

    先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的是GUID,表中没有创建任何索引.GUID必然是比自增长要快的,因为你生成一个GUID算法所花的时间肯定比你从数据表中重新查询上一条记 ...

  8. java 20 -10 字节流四种方式复制mp3文件,测试效率

    电脑太渣,好慢..反正速率是: 高效字节流一次读写一个字节数组 > 基本字节流一次读写一个字节数组 > 高效字节流一次读写一个字节 > 基本字节流一次读写一个字节 前两个远远快过后面 ...

  9. .NET MVC控制器向视图传递数据的四种方式

    .NET MVC控制器向视图传递数据的四种方式: 1.ViewBag  ViewBag.Mvc="mvc"; 2.ViewData ViewBag["Mvc"] ...

  10. JavaScript表单提交四种方式

    总结JavaScript表单提交四种方式 <!DOCTYPE html> <html> <head> <title>JavaScript表单提交四种方式 ...

随机推荐

  1. 《Modern C++ Design》之上篇

    如下内容是在看侯捷老师翻译的<Modern C++ Design>书籍时,整理的code和摘要,用于不断地温故知新. 第一章 1. 运用 Template Template 参数实作 Po ...

  2. vue3创建工程

    创建 Vue3 项目的步骤如下: 安装 Node.js Vue3 需要依赖 Node.js 环境,因此需要先安装 Node.js.可以从官网下载 Node.js 的安装包并安装,也可以使用包管理器安装 ...

  3. 号外:Splashtop与Jira发布新的远程支持集成

    首先个跟大家道个歉,近期最近因为技术调整等原因,官网自动跳转中文站失效,可能很多宝宝看了一周的英文站了.程序哥们还在加班加点解决这个问题.如果大佬们也遇到了这个情况,官网后面加个/cn就可以了. 别问 ...

  4. C语言:对fgets进行封装

    因为fgets在赋值完字符后,在最后会加一个\n换行符,所以为了能够把数组当成字符串,就必须把\n改成\0 代码: #include<stdio.h> #include<stdlib ...

  5. 移动通信网络中的 GTP 协议

    目录 文章目录 目录 GTP GTP-C 协议(GTP 控制面) GTP-U 协议(GTP 用户面) GTP' 协议(计费传输) GTPv2 Header GTP GTP(GPRS Tunnellin ...

  6. pageoffice 6 实现word文件添加水印

    在很多场景下,Word文档正式发文之前,或者说形成最终文档之前,常常需要往Word文件中添加水印,并且会根据文件类型或内容的不同,需要添加的水印也不一样. 添加水印是Word软件里的一个简单功能,直接 ...

  7. java学习之旅(day.04)

    运算符 算术运算符:+ ,- ,* ,/,%(取余或模运算), ++(自增),-- (自减) 赋值运算符:= 关系运算符:>, <,>=, <=, ==, !=(不等于),in ...

  8. docker之docker-compose

    docker-compose就是个二进制的工具,它可以单机编排,批量管理多个容器 [root@mcwk8s01 harbor]# file /usr/local/bin/docker-compose ...

  9. ubuntu禁止指定的软件升级

    禁止软件升级 sudo echo 软件包名 hold | sudo dpkg --set-selections 取消软件禁止升级的限制 sudo echo 软件包名 install | sudo dp ...

  10. C#老码农的职业生涯

    开头白 大家好,我是tibos,19年10月1号由深圳回武汉的码农,目前入职武汉福禄网络,最近刷到的年终总结也比较多,赶在这最后一天,我也来凑个热闹 心路历程 -> 菜鸟入江湖 13年开启码农的 ...