请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2008|回复: 0

单词统计

[复制链接]

821

主题

821

帖子

2663

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2663
发表于 2019-8-22 16:18:38 | 显示全部楼层 |阅读模式
对于这个text表,我们如何将其中的每行的单词进行统计呢?如果同学你有mysql的基础,你或许很快会联想的group by这个函数。而如果你有spark的基础,你或许会联想到split和map等算子,那在hive中,我们如何进行这个过程呢。
首先,由于一行文本有多个单词,所以我们需要将每行的文本切割成单个的单词,这里我们需要使用split函数:
  1. select split(line,' ') from text;
复制代码

如图所示,每行文本已经被切割开来,但是得到的是数组类型,并不是hive能直接通过group by处理的形式,所以我们需要使用hive的另一个高级函数explode。
explode这个函数的功能是行转列(俗称炸裂),也就是说将上面我们得到的数组中的每个元素生成一行。

命令如下:
  1. select explode(split(line,' ')) from text;
复制代码

对于我们炸裂出来的数据,原来的列的名称已经不再适用,我们将其取别名为word:
  1. select explode(split(line,' '))as word from text;
复制代码

接下来,我们就需要使用group by来对我们得到的炸裂开来的数据进行统计。
这里需要注意的是,我们需要将上面得到的结果作为另一张表t(子查询),然后对这张表进行统计,否则将会报错。

命令如下(注意:这个过程需要的时间会比较长,请耐心等待):
  1. select t.word,count(*) from (select explode(split(line,' '))as word from text) as t group by t.word;
复制代码

如图所示,我们已经将每个单词的个数统计出来,但是看起来总不怎么顺眼,接下来我们将所有单词按照降序排列,同时只打印前三个单词(注意:这个过程需要的时间会比较长,请耐心等待):
  1. select t.word,count(*) c from (select explode(split(line,' '))as word from text) as t group by t.word order by c desc limit 3;
复制代码

order by 默认升序,我们使用desc设置为降序,同时我们安装count(*)出来的结果作为排序的策略。
在实际生产环境中,我们都需要将我们查询得到的结果,存入另一张表中,以供其他人使用。
所以,本节最后一个操作就是将我们的结果存入另一张表中。

命令如下(注意:这个过程需要的时间会比较长,请耐心等待):
  1. create table wordcount as select t.word,count(*) c from (select explode(split(line,' '))as word from text) as t group by t.word order by c desc limit 3;
复制代码

查看wordcount表:
  1. desc wordcount;
  2. select *from wordcount;
复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

用户反馈
客户端