Shell脚本、HIVE、Spark实现wordcount

2019-12-16  本文已影响0人  Ghost_42cf

今天学习了使用三种方式实现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)

上一篇 下一篇

猜你喜欢

热点阅读