查詢和插入數(shù)據(jù)
Hive查詢操作參見文檔Select碾盟,插入操作參見文檔Inserting data into Hive Tables from queries和Writing data into the filesystem from queries棚辽。
簡單查詢
下面示例為查詢所有活躍用戶:
INSERT OVERWRITE TABLE user_active
SELECT user.*
FROM user
WHERE user.active = 1;
注意和SQL不一樣冰肴,這里總是將數(shù)據(jù)插入到user_active
表中。稍后會說明用戶如何檢查這些結(jié)果联逻,并且將結(jié)果轉(zhuǎn)存到本地文件中检痰。可以在Beeline和[Hive CLI]中運行下面的查詢:
SELECT user.*
FROM user
WHERE user.active = 1;
結(jié)果會重寫為一些臨時文件并在Hive客戶端進行展示公壤。
基于分區(qū)的查詢
查詢中使用哪些分區(qū)是由系統(tǒng)根據(jù)where
語句中分區(qū)列的條件決定的椎椰。例如,為了獲取所有03/2008從xyz.com引用過來的page_views慨飘,可以使用如下查詢:
INSERT OVERWRITE TABLE xyz_com_page_views
SELECT page_views.*
FROM page_views
WHERE page_views.date >= '2008-03-01' AND page_views.date <= '2008-03-31' AND
page_views.referrer_url like '%xyz.com';
注意這里用到了page_views.date
瓤的,因為上面的表定義了PARTITIONED BY(date DATETIME, country STRING)
。
連接
為了獲取2008-03-03的page_view人員統(tǒng)計分析(按照性別)堤瘤,可以使用userid
列連接page_view
表和user
表。使用下面查詢實現(xiàn):
INSERT OVERWRITE TABLE pv_users
SELECT pv.*, u.gender, u.age
FROM user u JOIN page_view pv ON (pv.userid = u.id)
WHERE pv.date = '2008-03-03';
要進行外連接桥帆,可使用LEFT OUTER
, RIGHT OUTER
或FULL OUTER
(左保留叶骨,右保留或雙向保留)關(guān)鍵字祈匙。例如,對上面的查詢進行全外連接夺欲,如下:
INSERT OVERWRITE TABLE pv_users
SELECT pv.*, u.gender, u.age
FROM user u FULL OUTER JOIN page_view pv ON (pv.userid = u.id)
WHERE pv.date = '2008-03-03';
檢查key是否在另一個表存在,可使用LEFT SEMI JOIN
伞剑,如下:
INSERT OVERWRITE TABLE pv_users
SELECT u.*
FROM user u LEFT SEMI JOIN page_view pv ON (pv.userid = u.id)
WHERE pv.date = '2008-03-03';
想連接多個表市埋,如下:
INSERT OVERWRITE TABLE pv_friends
SELECT pv.*, u.gender, u.age, f.friends
FROM page_view pv JOIN user u ON (pv.userid = u.id) JOIN friend_list f ON (u.id = f.uid)
WHERE pv.date = '2008-03-03';
注意Hive只支持equi-joins。建議將最大的表放在連接的最右邊抒倚,這樣性能最好坷澡。
聚合
按照性別計算不同用戶數(shù)量,如下:
INSERT OVERWRITE TABLE pv_gender_sum
SELECT pv_users.gender, count (DISTINCT pv_users.userid)
FROM pv_users
GROUP BY pv_users.gender;
可以同時進行多個聚合镣陕,但是不能對不同列進行聚合姻政,下面代碼是允許的:
INSERT OVERWRITE TABLE pv_gender_agg
SELECT pv_users.gender, count(DISTINCT pv_users.userid), count(*), sum(DISTINCT pv_users.userid)
FROM pv_users
GROUP BY pv_users.gender;
下面查詢是不允許的:
INSERT OVERWRITE TABLE pv_gender_agg
SELECT pv_users.gender, count(DISTINCT pv_users.userid), count(DISTINCT pv_users.ip)
FROM pv_users
GROUP BY pv_users.gender;
多表/文件插入
聚合或者簡單查詢的輸出可以進一步發(fā)送到多個表或者hadoop dfs文件岂嗓。如下:
FROM pv_users
INSERT OVERWRITE TABLE pv_gender_sum
SELECT pv_users.gender, count_distinct(pv_users.userid)
GROUP BY pv_users.gender
INSERT OVERWRITE DIRECTORY '/user/data/tmp/pv_age_sum'
SELECT pv_users.age, count_distinct(pv_users.userid)
GROUP BY pv_users.age;
第一個insert
語句將結(jié)果插入到Hive表中,第二個將結(jié)果存儲到hadoop dfs文件中食绿。
插入到本地文件
將結(jié)果輸出到本地文件公罕,這樣可以使用excel等工具查看文件。如下:
INSERT OVERWRITE LOCAL DIRECTORY '/tmp/pv_gender_sum'
SELECT pv_gender_sum.*
FROM pv_gender_sum;
抽樣
抽樣語句讓用戶可以寫查詢抽樣部分數(shù)據(jù)楼眷。目前抽樣是在列上進行的,在CREATE TABLE
中的CLUSTERED BY
語句中指定掌腰。下面的示例選擇了pv_gender_sum
表的第3個桶:
INSERT OVERWRITE TABLE pv_gender_sum_sample
SELECT pv_gender_sum.*
FROM pv_gender_sum TABLESAMPLE(BUCKET 3 OUT OF 32);
通常TABLESAMPLE
語法是這樣的:
TABLESAMPLE(BUCKET x OUT OF y)
y是表創(chuàng)建時指定的桶數(shù)量。針對上面的示例催植,下面的語句會選擇第3個和第19個桶勺择。
TABLESAMPLE(BUCKET 3 OUT OF 16)
下面的語句會選擇第3個桶的一半。
TABLESAMPLE(BUCKET 3 OUT OF 64 ON userid)
Union All
Hive SQL支持union all省核,例如芳撒,我們有兩個表,一個跟蹤用戶發(fā)布視頻笔刹,一個跟蹤用戶發(fā)布評論,下面的查詢將union all的結(jié)果和user
表進行連接:
INSERT OVERWRITE TABLE actions_users
SELECT u.id, actions.date
FROM (
SELECT av.uid AS uid
FROM action_video av
WHERE av.date = '2008-06-03'
UNION ALL
SELECT ac.uid AS uid
FROM action_comment ac
WHERE ac.date = '2008-06-03'
) actions JOIN users u ON(u.id = actions.uid);
數(shù)組操作
表中可以添加數(shù)組列萌壳,如下:
CREATE TABLE array_table (int_array_column ARRAY<INT>);
假設(shè)pv.friends
是ARRAY<INT>
類型的日月,用戶可以使用索引來獲取指定的元素,如下:
SELECT pv.friends[2]
FROM page_views pv;
select
語句獲取了pv.friends
的第三個元素尺借。
用戶也可以獲取數(shù)組的長度精拟,使用size
函數(shù),如下:
SELECT pv.userid, size(pv.friends)
FROM page_view pv;
Map操作
Map操作和數(shù)組操作類似蜂绎。這種結(jié)構(gòu)目前只能編程創(chuàng)建。之后會進行擴展怪瓶。假設(shè)pv.properties
是map<String, String>
類型践美,它是字符串到字符串的關(guān)聯(lián)數(shù)組找岖。
INSERT OVERWRITE page_views_map
SELECT pv.userid, pv.properties['page type']
FROM page_views pv;
上面示例從page_views
表中查詢page_type
屬性哆姻。
與數(shù)組類型,size
函數(shù)可用于獲取Map中元素的數(shù)量:
SELECT size(pv.properties)
FROM page_view pv;