離線數(shù)據(jù)分析平臺實戰(zhàn)——130Hive Shell命令介紹 02(熟悉Hive略過)
導(dǎo)入數(shù)據(jù)
Hive的導(dǎo)入數(shù)據(jù)基本上可以分為三類,
第一種是從linux系統(tǒng)上導(dǎo)入數(shù)據(jù)到hive表中速警,
第二種是從hdfs上導(dǎo)入數(shù)據(jù)到hive表中叹誉,
第三種是從已有的hive表中導(dǎo)入數(shù)據(jù)到新的hive表中闷旧。
其中第一種和第二種語法基本類似长豁;
在前面介紹的使用create table ... as... 命令創(chuàng)建表并導(dǎo)入數(shù)據(jù),也屬于第三種導(dǎo)入數(shù)據(jù)方法忙灼。
使用前兩種方式導(dǎo)入數(shù)據(jù)匠襟,只是復(fù)制或者移動數(shù)據(jù)文件,并不會對數(shù)據(jù)的模式(數(shù)據(jù)類型)進(jìn)行檢查该园,對數(shù)據(jù)模式的檢查要等到查詢數(shù)據(jù)的時候才會進(jìn)行酸舍。采用這種"schema on read"的模式可以提高數(shù)據(jù)加載效率。
導(dǎo)入數(shù)據(jù)命令
第一種命令和第二種命令的區(qū)別在于里初,
導(dǎo)入linux系統(tǒng)上的數(shù)據(jù)是進(jìn)行文件復(fù)制啃勉,導(dǎo)入hdfs上的數(shù)據(jù)是進(jìn)行文件移動。
也就是說在hdfs上進(jìn)行數(shù)據(jù)的導(dǎo)入后双妨,原位置的文件將不存在淮阐。命名如下:
load data [local] inpath 'filepath' [overwrite] into table tablename
叮阅。
使用local關(guān)鍵字來區(qū)分是從linux系統(tǒng)還是從hdfs上獲取數(shù)據(jù)。
注意:
其實當(dāng)不指定local的時候枝嘶,數(shù)據(jù)來源是根據(jù)hadoop的fs.defaultFS和hive的hive.metastore.warehouse.dir來定義的帘饶,當(dāng)然也可以指定路徑的全部schema信息。
最后一種導(dǎo)入數(shù)據(jù)的命令其實我們是比較常用的一種群扶,底層是使用mapreduce程序進(jìn)行數(shù)據(jù)的導(dǎo)入操作的及刻。命令如下:
INSERT (OVERWRITE|INTO) TABLE tablename1 select_statement1 FROM from_statement where_statement;
使用overwrite和into的區(qū)別在于,overwrite是進(jìn)行重寫操作竞阐,也就是說會將原始數(shù)據(jù)進(jìn)行刪除缴饭。
into是進(jìn)行添加操作,原始數(shù)據(jù)不會進(jìn)行刪除骆莹。
注意:當(dāng)我們將from語句提到最前面的時候颗搂,我們可以進(jìn)行多表插入。
select命令詳解
select命令和表中sql中的定義是一樣的幕垦,都是查詢數(shù)據(jù)表的數(shù)據(jù)丢氢,命令格式如下所示:
SELECT [ALL | DISTINCT] select_expr, select_expr, ... -- 返回的查詢列表
FROM table_reference -- from語句,一般可以放到with之后先改,select之前
[WHERE where_condition] -- where過濾條件
[GROUP BY col_list [HAVING having_condition]] -- 分組條件
[ORDER|SORT BY colName (ASC|DESC)] -- 排序條件
[LIMIT number] -- limit條件
From語句
From語句主要是指定從那個數(shù)據(jù)表中查詢數(shù)據(jù)疚察,有兩種使用方式:
分別可以在select后和with后&select前使用,
語法格式:
- [with ...] select ... from ...
- [with ...] from ... select ...
示例:
select * from students;
from students select *;
CTE語句
Common Table Expression(CTE)主要作用是保存臨時結(jié)果仇奶,作為查詢語句的公用部分貌嫡,方便后面的select查詢中重復(fù)使用。
語法規(guī)則為:
with cte_name [AS (select statment)] (,cte_name [AS (select statment)])* select ....
order/sort by語句
Order/Sort by語句主要用于hive中的數(shù)據(jù)排序该溯,這兩個命令的使用方式都類似sql語法中的order by岛抄。
兩者的主要區(qū)別是:
sort by保證單reducer有序,order by保證全局有序狈茉,也就是說當(dāng)reducer個數(shù)為多個的時候夫椭,使用sort by可能出現(xiàn)局部有序的情況。
另外對于order by操作氯庆,有一個小的限制益楼,就是當(dāng)hive.mapred.mode模式為strict的時候,在order by語句后面必須跟著limit語句点晴。
語法格式如下:
(order|sort) by colname [asc|desc] (,colname [asc|desc])*
Join語法
在多表查詢的時候,由于表與表之間有關(guān)聯(lián)性悯周,所有hive提供了join的語法粒督,基本類似sql的join語法。
主要分為以下五類:
- 內(nèi)連接(JOIN)
- 外鏈接({LEFT|RIGHT|FULL} [OUTER] JOIN)
- 半連接(LEFT SEMI JOIN)
- 笛卡爾連接(CROSS JOIN)
- 其他連接方式(eg. mapjoin等)
語法格式:
left_table_reference [join type] right_table_ref [join_condition]* ([join type] right_table_ref [join_condition]*)*
使用join建議&問題
- 等值連接:hive中的所有連接條件必須為等值連接條件禽翼,不支持<>等非等值連接方式屠橄。
- 多表連接:多表連接的時候族跛,一般先進(jìn)行l(wèi)eft semi join,然后再進(jìn)行join, 再進(jìn)行外連接锐墙。(減少數(shù)據(jù)量)礁哄。
- join過濾條件,可以將where的過濾條件移動到j(luò)oin的過濾條件中去溪北,這樣可以減少網(wǎng)絡(luò)數(shù)據(jù)量桐绒。
- join執(zhí)行順序都是從左到右,不管是那種join方式之拨,那么一般將大的表放到右邊茉继,這樣可以節(jié)省內(nèi)存&減少網(wǎng)絡(luò)傳輸。
- mapjoin只適合連接表是小表的情況蚀乔,是一種空間換時間的解決方案烁竭。
內(nèi)連接語法
內(nèi)連接(JOIN)主要作用是獲取連接的兩張表全部匹配的數(shù)據(jù),如果不給定join_condition的話吉挣,會進(jìn)行笛卡爾乘積派撕。
笛卡爾連接(CROSS JOIN)和內(nèi)連接語法一樣,區(qū)別在于:笛卡爾連接是對內(nèi)連接的一種優(yōu)化睬魂。
語法格式為:
table_reference [cross] join table_factor [join_condition]
外連接語法
外連接的主要作用是保留一部分沒有匹配的數(shù)據(jù)终吼。
左外連接(LEFT OUTER JOIN)的結(jié)果是包括左表中的所有行,如果左表中的某一個行在右表中不存在汉买,那么則在相關(guān)聯(lián)的結(jié)果集中右表的所有選擇列值均設(shè)置為空值衔峰。
右外連接(RIGHT OUTER JOIN)就是左外連接的反先連接,將返回右表的所有行蛙粘,左表進(jìn)行空值填充垫卤。
全外連接(FULL OUTER JOIN)返回左表和右表的所有行,關(guān)聯(lián)表中沒有匹配值的直接設(shè)置為空值出牧。
語法格式為:
table_reference {left|right|full} [outer] join table_factor join_condition
半連接語法
半連接(LEFT SEMI JOIN)是hive特有的穴肘,hive中不支持in/exists操作,所以hive提供了一個替代方案舔痕。
需要注意的是评抚,被連接的表(右表),不能出現(xiàn)在查詢列/其他部分(where等)中伯复,只能出現(xiàn)在on字句中慨代。(出現(xiàn)也是無效的)。
提出半連接的主要作用其實是提高查詢效率啸如,真正來講的話侍匙,hive中可以使用其他連接方式來代替半連接,但是就效率而已的話叮雳,還是半連接比較高效想暗。
語法格式:
table_reference LEFT SEMI JOIN table_factor join_condition
mapjoin
如果所有被連接的表都是小表妇汗,那么可以使用mapjoin,將需要連接的表數(shù)據(jù)全部讀入mapper端內(nèi)存中。
也就是說你使用mapjoin的前提就是你的連接數(shù)據(jù)比較小说莫,mapjoin需要和其他join方式一起使用杨箭,一般情況下使用mapjoin的時候,推薦使用內(nèi)連接储狭。
語法格式為:
select /*+ MAPJOIN(table_ref1) */ ... from table_ref join table_ref1 on ....;
子查詢語法
Hive對子查詢的支持有限互婿,只支持嵌套select子句,而且只能在from和with語句塊中使用子查詢晶密。
語法規(guī)則如下:
.... from (select statement) [[as] tmp_name]....
導(dǎo)出數(shù)據(jù)
Hive中導(dǎo)出數(shù)據(jù)主要分為兩大類擒悬,
分別是導(dǎo)出數(shù)據(jù)到linux系統(tǒng)和導(dǎo)出數(shù)據(jù)到hdfs文件系統(tǒng)上。
另外也可以認(rèn)為導(dǎo)出數(shù)據(jù)到其他hive表也算導(dǎo)出數(shù)據(jù)(不過該方式也是導(dǎo)入數(shù)據(jù))稻艰。
命令如下:
INSERT OVERWRITE [LOCAL] DIRECTORY directory1 [row format row_format] [stored as file_format] SELECT ... FROM ...
注意:hive導(dǎo)出數(shù)據(jù)支持一次導(dǎo)出到多個文件夾中懂牧,同多表同時導(dǎo)入數(shù)據(jù)一樣。
其他常用命令&組件
union: 進(jìn)行數(shù)據(jù)合并尊勿,格式為:
select1 union all select2... union all selectn
explain: hql執(zhí)行計劃查詢僧凤。格式為: explain hql
hive -e "hql"
:在linux系統(tǒng)中執(zhí)行hive語句。
hive -f "filepath"
: 執(zhí)行l(wèi)inux系統(tǒng)中的包含hive語句的文件元扔。
view:hive支持視圖的使用躯保,單只支持邏輯視圖,不支持物理視圖澎语。
使用語法和table類型途事,創(chuàng)建語法格式為: create view viewname as select_statement