今天学习了使用三种方式实现wordcount的。
数据如下,用空格分隔
hello world i am comming
hello world you are here
hello mike
how are you
1、Linux的shell实现
脚本如下
#!/bin/bash
# filename: wordcount.sh
# usage: word count
# handle position arguments
if [ $# -ne 1 ]
then
echo "Usage: $0 filename"
exit -1
fi
# realize word count
printf "%-14s%s\n" "Word" "Count"
cat $1 | tr 'A-Z' 'a-z' | \
egrep -o "\b[[:alpha:]]+\b" | \
awk '{ count[$0]++ }
END{
for(ind in count)
{ printf("%-14s%d\n",ind,count[ind]); }
}' | sort -k2 -n -r
2、HIVE实现
首先创建表
create table wordcount(line string);
然后加载数据到表,从本地加载:
LOAD DATA LOCAL INPATH '/home/hadoop/data/words.txt' INTO TABLE wordcount;
select word,count(1) as 'count' from (select explode(split(line), ' ') as word from wordcount)
GROUP BY word ORDER BY count desc;
3、Spark方式实现
我是cli模式下编写的所以不用指定SaprkConf 和SparkContext,从本地读取数据
思路是这样的:读取数据后,首先使用flatMap算子将数据拆分为一个个的单词,然后使用map方法,每个单词后面拼上一个“1”,然后使用reduceByKey对上一步的结果按照K进行聚合,最后要实现排序的话,需要反转上一步的结果,然后使用sortByKey方法按照K进行排序,注意此时的K是我们的单词个数,最后再一次使用map方法,得到我们的结果。
代码如下:
val result = sc.textFile("file:///home/hadoop/data/words.txt").flatMap(x =>x.split(' ')).map(x =>(x,1)).reduceByKey(_+_).map(x =>(x._2,x._1)).sortByKey(false).map(x =>(x._2,x._1)).foreach(println)
网友评论