使用Hive處理WordCount

停不下的腳步發表於2014-12-25
一.在Hive中建立存放要處理的資料的表
$hive> create table textlines(line string)

匯入資料:
$hive> load data inpath ’tmp/input’ overwrite into table textlines;
如果想從本地匯入,可以使用這個load data local inpath '...',這裡的就會是這樣的/tmp/input/wordcount。

檢視是否匯入成功:
$hive> select * from texlines;

二.用HIVE實現map/reduce的計算

下面是HIVE程式設計指南給出的word count HQL:
SELECT word,count(1) AS count FROM (SELECT explode(split(,'[ \t]+') ) AS word FROM docs ) w GROUP BY word ORDER BY word;

我講上面語句拆分成兩條語句:

SELECT explode(split(line,’\s’)) AS word FROM docs;
SELECT word,count(1) FROM w GROUP BY word ORDER BY word;

所以我先建立一個words表,存放第一條查詢的結果:
$hive> create table words(word STRING);
$hive> insert overwrite table words select explode(split(line,'\s’)) word from textlines;

注:關鍵語句是select explode(split(line,'\s’)) 這句將處罰Hadoop進行MapReduce計算,explode()函式表示將字串分割為陣列,\s是正則,表示空白字元,split(line,'\s’)就是將line(textiles表的欄位)按照正則\s分割,然後explode函式將KEY相同的value存在陣列裡。這HQL條語句相當於Hadoop中的Map函式。

現在來處理第二條HQL語句:SELECT word,count(1) FROM w GROUP BY word ORDER BY word;
$hive> SELECT word,count(1) FROM words GROUP BY word ORDER BY word;
注:這條語句相當於Hadoop中的reduce函式。




三.將我們處理獲得的結果匯出:
$hive> INSERT OVERWRITE LOCAL DIRECTORY ‘/tmp/wordcount_result’ SELECT word,count(1) FROM words GROUP BY word ORDER BY word;
LOCAL去掉表示匯出到HDFS的目錄;

下面就用Sqoop將HDFS上的結果儲存到mysql上了

相關文章