|
对于这个text表,我们如何将其中的每行的单词进行统计呢?如果同学你有mysql的基础,你或许很快会联想的group by这个函数。而如果你有spark的基础,你或许会联想到split和map等算子,那在hive中,我们如何进行这个过程呢。
首先,由于一行文本有多个单词,所以我们需要将每行的文本切割成单个的单词,这里我们需要使用split函数:
- select split(line,' ') from text;
复制代码
如图所示,每行文本已经被切割开来,但是得到的是数组类型,并不是hive能直接通过group by处理的形式,所以我们需要使用hive的另一个高级函数explode。
explode这个函数的功能是行转列(俗称炸裂),也就是说将上面我们得到的数组中的每个元素生成一行。
命令如下:
- select explode(split(line,' ')) from text;
复制代码
对于我们炸裂出来的数据,原来的列的名称已经不再适用,我们将其取别名为word:
- select explode(split(line,' '))as word from text;
复制代码
接下来,我们就需要使用group by来对我们得到的炸裂开来的数据进行统计。
这里需要注意的是,我们需要将上面得到的结果作为另一张表t(子查询),然后对这张表进行统计,否则将会报错。
命令如下(注意:这个过程需要的时间会比较长,请耐心等待):
- select t.word,count(*) from (select explode(split(line,' '))as word from text) as t group by t.word;
复制代码
如图所示,我们已经将每个单词的个数统计出来,但是看起来总不怎么顺眼,接下来我们将所有单词按照降序排列,同时只打印前三个单词(注意:这个过程需要的时间会比较长,请耐心等待):
- 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(*)出来的结果作为排序的策略。
在实际生产环境中,我们都需要将我们查询得到的结果,存入另一张表中,以供其他人使用。
所以,本节最后一个操作就是将我们的结果存入另一张表中。
命令如下(注意:这个过程需要的时间会比较长,请耐心等待):
- 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表:
- desc wordcount;
- select *from wordcount;
复制代码
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|