初學MapReduce編程,WordCount做爲入門經典,相似於初學編程時的Hello World。WordCount的邏輯就是給定一個/多個文本,統計出文本中每次單詞/詞出現的次數。網上找的一張MapReduce實現WordCount的圖例,基本描述清楚了WordCount的內部處理邏輯。本文主要是從Hive使用的角度處理WordCount,就不贅述,以前的一篇博文有MapReduce實現WordCount的代碼,可參考 http://www.javashuo.com/article/p-xoeslkzg-mq.html。html
圖1 MapRecude實現Word Count圖例apache
先直接上SQL語句,能夠看出SQL實現確實比MapReduce實現要清爽得多。大概實現流程分爲三步:編程
SELECT word, count(1) AS count FROM (SELECT explode(split(line, '\r')) AS word FROM docs) w GROUP BY word ORDER BY word;
1. 準備文本內容oop
新建一個 /home/kwang/docs.txt 文本,文本內容以下:spa
hello world
hello kwang rzheng
2. 新建hive表code
這裏因爲hive環境建表默認格式是ORC,直接load數據hive表沒法直接讀取,故建表時指定了表格式。orm
CREATE TABLE `docs`( `line` string) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat';
3. 加載數據到hive表中htm
加載數據到hive表中有兩種方式,一種是從Linux本地文件系統加載,一種是從HDFS文件系統加載。blog
(1)從Linux本地文件系統加載hadoop
LOAD DATA LOCAL INPATH '/home/kwang/docs.txt' OVERWRITE INTO TABLE docs;
(2)從HDFS文件系統加載
首先須要將文件上傳到HDFS文件系統
$ hadoop fs -put /home/kwang/docs.txt /user/kwang/
其次從HDFS文件系統加載數據
LOAD DATA INPATH 'docs.txt' OVERWRITE INTO TABLE docs;
加載數據到hive表後,查看hive表的內容,和原始文本格式並無區別,將文本按行存儲到hive表中,能夠經過 'select * from docs;' 看下hive表內容:
hello world
hello kwang rzheng
4. 分割文本
分割單詞SQL實現:
SELECT split(line, '\s') AS word FROM docs;
分割後結果:
["hello","world"] ["hello","kwang","rzheng"]
能夠看出,分割後的單詞還是都在一行,沒法實現想要的功能,所以須要進行行轉列操做。
5. 行轉列
行轉列SQL實現:
SELECT explode(split(line, ' ')) AS word FROM docs;
轉換後的結果:
hello
world
hello
kwang
rzheng
6. 統計計數
SELECT word, count(1) AS count FROM (SELECT explode(split(line, ' ')) AS word FROM docs) w GROUP BY word ORDER BY word;
統計後結果:
hello 2 kwang 1 rzheng 1 world 1
至此,Hive已實現WordCount計數功能。
【參考資料】
[1]. https://www.oreilly.com/library/view/programming-hive/9781449326944/ch01.html