hadoop之hive在數據檢索中的用法

hive:我只用他來檢索過日誌,對這個談不上什麼精通或熟練,只是會使用而已,可以按需求進行特定的數據檢索而已,這個東西很方便,比map-reduce方便很多

你可以把他完全當成mysql來用,因爲這個也是用的SQL 語句,存儲只不過數據不是存在我們常用的mysql等數據庫中

爲什麼有map-reduce還要有這個hive呢?

我個人的理解是,map-reduce不管你查詢什麼或計算什麼都需要一次任務提交,調度,計算,輸出

這個都需要走完應該走的流程,而hive則不一樣儘管他是把類似的SQL語句轉成map-reduce來處理,

下面幾個說明簡單的說一下這個是什麼?


一:什麼是Hive

•Hive是基於Hadoop的一個數據倉庫工具,可以將結構化的數據文件映射爲一張數據庫表,並提供類SQL查詢功能。

•本質是將SQL轉換爲MapReduce程序

 

二:爲什麼用Hive

爲什麼要使用Hive

•操作接口採用類SQL語法,提供快速開發的能力

•避免了去寫MapReduce,減少開發人員的學習成本

•擴展功能很方便

 

三:Hive與Hadoop的關係

 

四:數據庫對比

 

Hive

RDBMS

查詢語言

HQL

SQL

數據存儲

HDFS

Raw Device or Local FS

執行

MapReduce

Excutor

執行延遲

處理數據規模

索引

0.8版本後加入位圖索引

有複雜的索引

 





下面我以數據檢索爲需求,一步步的把這個用法說清楚(不是理論高度,呵呵,我也沒有那個高度)


再次明確一下示例需求: 每天每小時網絡上都有一批日誌實時的入到hdfs中,例如你在hadoop命令查看如2013-11-30目錄下的內容格式如

/home/data/ineternet/2013-11-30/00.log

/home/data/ineternet/2013-11-30/01.log

/home/data/ineternet/2013-11-30/02.log

.....

/home/data/ineternet/2013-11-30/23.log

 我們需要可以隨時查看某天某個時間的日誌信息。



首先,需要創建對應的表,之後才能使用hive  SQL來進行查詢

而創建表中各項可以根據需要查看的信息進行定製,但在創建表之前需要將日誌進行劃分partition,這相當於把日誌按某種條件分類索引以便按要求查詢,

例如示例建表腳本如下:


cat hive.create.sh
#!/bin/bash

hivepath=/home/software/hive//bin
hadooppath=/home/software/hadoop//bin
dirs=$($hadooppath/hadoop fs -ls /home/data/internet/*)

addPartition=
for dir in $dirs
do
    #echo $dir
    if [[ `expr length $dir` -gt 10 ]]
    then
        day=`echo $dir|awk --posix -F'/' '{if ($5~/[0-9]{4}-[0-9]{2}-[0-9]{2}/){print $5}}'`
        hour=`echo $dir|awk --posix -F'/' '{if ($6~/[0-9]{2}/){print $6}}'`
        if [[ `expr length "$day"` -gt 0 && `expr length "$hour"` -gt 0 ]]
        then
            addPartition=$addPartition" alter table hive_table add partition (day='$day',hour='$hour') location '$dir';"   
        fi
    fi
done

#echo $addPartition
##############################################################
$hivepath/hive << EOF
drop table hive_table;
create external table hive_table
(
time string,
host string,
pid string,
info string,
src string,
stage string,
key string,
ret string
)partitioned by (day string,hour string)
clustered by (key) into 32 buckets
row format delimited fields terminated by '\t'
lines terminated by '\n';
$addPartition
EOF

從上面的腳本可以看到兩部分,上面部分是創建partition,即是將天和小時進行劃分,下面是根據劃分創建表hive_table

後面我們的查詢也是基於這個hive_table表


待續



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章