Hadoop組件之Hive
Hive 是一個構建在Hadoop上的數據倉庫框架,是應Facebook每天產生的海量新興社會網絡數據進行管理和機器學習的需求而產生和發展。Hive設計的目的是讓精通sql技能但java編程技能相對較弱的分析師能夠對Facebook存放在HDFS中的大規模數據集執行查詢。
Hive簡介
Hive提供了基於SQL的接口,即Hive查詢語言(HiveQL),能夠將查詢語言轉換成Java MapReduce代碼,並在集羣上運行。如圖:
數據庫: 命名空間將數據將表與其它數據單元分離開來,防止命名衝突;
表: 組織具有相同結構的記錄集合;
分區: 可選部分,分區是基於特定屬性分類給定信息的數據的邏輯隔離;
桶或集羣: 與分區相似,但是用哈希函數來分離數據;
分區和桶: 用來提高性能使得數據更易管理。
Hive 架構
如圖所示,Hive 由APIs, 用戶接口, 服務器, 作業, task trackers, 和JDBC 驅動器等組件組成。
如下是訪問Hive的不同方式:
• Hive 命令行接口(CLI)
• Hive Web 接口
• Hive 服務器
• JDBC/ODBC
Hive元存儲是一個數據庫,該數據庫存儲着與數據庫,表,列,數據類型以及在HDFS中的位置的所有相關元數據。
Hive的數據類型
Hive支持原生數據類型,包括數值型,字符串類型,布爾型,以及二進制類型,如圖。它也支持複雜數據類型,包括數組,鍵值,結構體以及聯接。
Hive 內建操作符
關係型操作符:
這些操作符用來建立兩個實體時間的比較關係,兩個實體各據操作符一邊,示例如下: X=Y, X!=Y, X>=Y, X IS NULL, X LIKE Y, X RLIKE Y等。
算數運算符:
這類操作符用來做一些數學運算,例如: X+Y, X-Y, XY, X/Y, X&Y, X|Y, X^Y, X 等.
邏輯運算符:
Hive中支持的邏輯運算符示例如下: X AND Y / X && Y, X OR Y / X
Hive 內建函數
Hive常用的命令
創建表,t作爲列的分隔符:
create table tradedetail (id bigint,income double,expenses double,time string) row formate delimited fields terminated by 't';
create table userinfo(id bigint, account string, name string, age int) row format delimited fields terminated by 't';
在創建表的的同時進行賦值:
create table result row format delimited fields terminated by 't' as select t1.account, t1.income, t1.expenses, t1.surplus, t2.name from userinfo t2 join (select account, sum(income) as income, sum(expenses) as expenses, sum(income-expenses) as surplus from tradedetail group by account) t1 on(t1.account = t2.account);
加載本地文件到數據表中:
load data local inpath '/home/hadoop/data/student.txt' overwrite into table student;
load data local inpath '/home/hadoop/data/userinfo.doc' overwrite into table userinfo;
創建外部表 ,創建外部表的一般情況指的是:先有文件存放着數據,之後我們再來創建表,也就是說創建一張表,然後指向這個有數據的目錄。以後只要是向這個目錄中上傳符合格式的數據會被自動裝在到數據庫表中,因爲在metastore(元數據)會記錄這些信息:
create external table tdetail(id bigint, account string, income double, expenses double, time string) ) row format delimited fields terminated by 't' location '/hive/tdpartition';
創建分區表,一般用於數據量比較大的情況下, partitioned by (logdate string)用來指定按照什麼進行分區:
create external table tdetail(id bigint, account string, income double, expenses double, time string) row format delimited fields terminated by 't' location '/hive/tdpartition' partitioned by (logdate string);
將mysql中的數據直接保存到Hive中:
sqoop export –connect jdbc:mysql://192.168.8.103:3306/hmbbs –username root –password hadoop –export-dir '/user/hive/warehouse/pv20130531/0000000' –table pv
基本的插入語法:
insert overwrite table tablename partiton(partcol1=val1,partclo2=val2)selectstatement from tstatement
insert overwrite table testinsert select from testtable;
更新表的名稱:
hive> alter table source RENAME TO target;
添加新一列:
alter table invites add columns (newcol2 INT COMMENT 'a comment');
刪除表:
DROP TABLE records;
刪除表中數據,但要保持表的結構定義:
dfs -rmr /user/hive/warehouse/records;
顯示所有函數:
show functions;
查看函數用法:
describe function substr;
內連接:
SELECT <col1>, <col2> FROM <table1> t1 JOIN <table2> t2 ON (<condition>);
右外連接:
SELECT <col1>, <col2> FROM <table1> RIGHT OUTER JOIN <table2> ON <cond.>;
左外連接:
SELECT <col1>, <col2> FROM <table1> LEFT OUTER JOIN <table2> ON <cond.>;
全外連接:
SELECT <col1>, <col2> FROM <table1> FULL OUTER JOIN <table2> ON (<condition>);
交叉連接:
SELECT FROM <table1> JOIN <table2>;
創建視圖:
hive> CREATE VIEW validrecords AS SELECT FROM records2 WHERE temperature !=9999;
查看視圖詳細信息:
hive> DESCRIBE EXTENDED validrecords;
Hive的特點
Hive 提供了一個基於SQL的接口, 稱作Hive查詢語言或HiveQL, 能夠將查詢語句轉換成Java MapReduce代碼,並在Hadoop集羣中運行;Hive 不支持在數據庫表中執行行插入和更新;Hadoop藉助對數據存儲和處理的高容忍特性在分佈式結構上實現了大量擴展性。Hive 是個數據倉庫工具—它獲取的大部分數據都是結構化的並且存儲在扁平化文件中或者類似 Teradata 或nformatica這樣的工具中。
ALTER TABLE 命令可以用來:
修改表名 ;
修改列簇 ;
增添新列 ;
刪除一些列;
更改表的某些屬性 ;
增加新的分區 。
HiveQL 查詢
使用Hive語句操作數據庫時,速度較慢,尤其是在上100G的數據中做查詢操作時耗時耗資源,1T以上的數據查詢就更慢了,但我們要了解HiveQL做查詢時的語法。
HiveQL 查詢最常見的類型是SELECT語句,除了SELECT語句之外,另一個重要的HiveQL 查詢是條件限制查詢,嵌套查詢, CASE…WHEN…THEN 查詢, LIKE和RLIKE 查詢, GROUP BY 查詢等。他的語法結構與Mysql的語法結構十分類似。
Select 語句:
SELECT <column1>, <column2> FROM <tablename>;
從列中查詢給定字符串開頭的記錄:
SELECT string FROM <tablename>;
限制條件查詢:
SELECT FROM <tablename> limit 10;
嵌套查詢:
SELECT FROM <tablename> where <condition> <compares> (SELECT <column> FROM <tablename>);
CASE…WHEN…THEN 查詢:
SELECT <column1>, CASE WHEN <condition1> THEN <option1>, WHEN <condition2> THEN <option2>, ELSE <option3> END AS <column2> FROM <tablename>;
LIKE 和 RLIKE 模糊查詢:
SELECT FROM <tablename> WHERE <column1> LIKE ‘%string%’; SELECT FROM <tablename> WHERE <column2> RLIKE ‘.(string).’;
GROUP BY 查詢:
SELECT <column1>, <column2> FROM <tablename> GROUP BY <column1>;
HAVING 查詢:
SELECT <column1>, <column2> FROM <tablename> GROUP BY <column1> HAVING <column1=value1> OR <column1=value2>;
還可以使用自定義函數操作數據庫,此處就不給出了。
性能調試和查詢優化
調試和優化Hive查詢語句需要理解Hive查詢是如何工作的,想要知道Hive查詢是如何工作,需要使用EXPLAIN命令。通常, EXPLAIN命令的輸出包含3部分。
Hive安全機制
談到Hive的安全機制時,首先要提到兩個概念: 驗證與授權。
參數hive.files.umask.value 的值決定了新建條目的默認權限,而參數 hive.metastore.authorization.storage.checks 值爲真時,則判斷用戶是否有在 Hive中刪除表格的權限. 同樣地,也可以在Hive中授權. 下圖是相應的權限:
至此,Hadoop組件之Hive中簡單基本的問題就介紹完了,我的個人感覺是Hive提供的對數據操作的方式簡單,降低了學習Hadoop的成本,但不足是不能對數據進行實時查詢,當然有其他的Hadoop組件來完成改工作了。這點我們後面慢慢說。