美文网首页
Shell脚本、HIVE、Spark实现wordcount

Shell脚本、HIVE、Spark实现wordcount

作者: Ghost_42cf | 来源:发表于2019-12-16 22:11 被阅读0次

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

    相关文章

      网友评论

          本文标题:Shell脚本、HIVE、Spark实现wordcount

          本文链接:https://www.haomeiwen.com/subject/qkhjnctx.html