離線數(shù)據(jù)分析平臺(tái)實(shí)戰(zhàn)——130Hive Shell命令介紹 02(熟悉Hive略過(guò))
導(dǎo)入數(shù)據(jù)
Hive的導(dǎo)入數(shù)據(jù)基本上可以分為三類(lèi),
第一種是從linux系統(tǒng)上導(dǎo)入數(shù)據(jù)到hive表中,
第二種是從hdfs上導(dǎo)入數(shù)據(jù)到hive表中,
第三種是從已有的hive表中導(dǎo)入數(shù)據(jù)到新的hive表中。
其中第一種和第二種語(yǔ)法基本類(lèi)似;
在前面介紹的使用create table ... as... 命令創(chuàng)建表并導(dǎo)入數(shù)據(jù),也屬于第三種導(dǎo)入數(shù)據(jù)方法。
使用前兩種方式導(dǎo)入數(shù)據(jù),只是復(fù)制或者移動(dòng)數(shù)據(jù)文件,并不會(huì)對(duì)數(shù)據(jù)的模式(數(shù)據(jù)類(lèi)型)進(jìn)行檢查,對(duì)數(shù)據(jù)模式的檢查要等到查詢數(shù)據(jù)的時(shí)候才會(huì)進(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)行文件移動(dòng)。
也就是說(shuō)在hdfs上進(jìn)行數(shù)據(jù)的導(dǎo)入后,原位置的文件將不存在。命名如下:
load data [local] inpath 'filepath' [overwrite] into table tablename
。
使用local關(guān)鍵字來(lái)區(qū)分是從linux系統(tǒng)還是從hdfs上獲取數(shù)據(jù)。
注意:
其實(shí)當(dāng)不指定local的時(shí)候,數(shù)據(jù)來(lái)源是根據(jù)hadoop的fs.defaultFS和hive的hive.metastore.warehouse.dir來(lái)定義的,當(dāng)然也可以指定路徑的全部schema信息。
最后一種導(dǎo)入數(shù)據(jù)的命令其實(shí)我們是比較常用的一種,底層是使用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)行重寫(xiě)操作,也就是說(shuō)會(huì)將原始數(shù)據(jù)進(jìn)行刪除。
into是進(jìn)行添加操作,原始數(shù)據(jù)不會(huì)進(jìn)行刪除。
注意:當(dāng)我們將from語(yǔ)句提到最前面的時(shí)候,我們可以進(jìn)行多表插入。
select命令詳解
select命令和表中sql中的定義是一樣的,都是查詢數(shù)據(jù)表的數(shù)據(jù),命令格式如下所示:
SELECT [ALL | DISTINCT] select_expr, select_expr, ... -- 返回的查詢列表
FROM table_reference -- from語(yǔ)句,一般可以放到with之后,select之前
[WHERE where_condition] -- where過(guò)濾條件
[GROUP BY col_list [HAVING having_condition]] -- 分組條件
[ORDER|SORT BY colName (ASC|DESC)] -- 排序條件
[LIMIT number] -- limit條件
From語(yǔ)句
From語(yǔ)句主要是指定從那個(gè)數(shù)據(jù)表中查詢數(shù)據(jù),有兩種使用方式:
分別可以在select后和with后&select前使用,
語(yǔ)法格式:
- [with ...] select ... from ...
- [with ...] from ... select ...
示例:
select * from students;
from students select *;
CTE語(yǔ)句
Common Table Expression(CTE)主要作用是保存臨時(shí)結(jié)果,作為查詢語(yǔ)句的公用部分,方便后面的select查詢中重復(fù)使用。
語(yǔ)法規(guī)則為:
with cte_name [AS (select statment)] (,cte_name [AS (select statment)])* select ....
order/sort by語(yǔ)句
Order/Sort by語(yǔ)句主要用于hive中的數(shù)據(jù)排序,這兩個(gè)命令的使用方式都類(lèi)似sql語(yǔ)法中的order by。
兩者的主要區(qū)別是:
sort by保證單reducer有序,order by保證全局有序,也就是說(shuō)當(dāng)reducer個(gè)數(shù)為多個(gè)的時(shí)候,使用sort by可能出現(xiàn)局部有序的情況。
另外對(duì)于order by操作,有一個(gè)小的限制,就是當(dāng)hive.mapred.mode模式為strict的時(shí)候,在order by語(yǔ)句后面必須跟著limit語(yǔ)句。
語(yǔ)法格式如下:
(order|sort) by colname [asc|desc] (,colname [asc|desc])*
Join語(yǔ)法
在多表查詢的時(shí)候,由于表與表之間有關(guān)聯(lián)性,所有hive提供了join的語(yǔ)法,基本類(lèi)似sql的join語(yǔ)法。
主要分為以下五類(lèi):
- 內(nèi)連接(JOIN)
- 外鏈接({LEFT|RIGHT|FULL} [OUTER] JOIN)
- 半連接(LEFT SEMI JOIN)
- 笛卡爾連接(CROSS JOIN)
- 其他連接方式(eg. mapjoin等)
語(yǔ)法格式:
left_table_reference [join type] right_table_ref [join_condition]* ([join type] right_table_ref [join_condition]*)*
使用join建議&問(wèn)題
- 等值連接:hive中的所有連接條件必須為等值連接條件,不支持<>等非等值連接方式。
- 多表連接:多表連接的時(shí)候,一般先進(jìn)行l(wèi)eft semi join,然后再進(jìn)行join, 再進(jìn)行外連接。(減少數(shù)據(jù)量)。
- join過(guò)濾條件,可以將where的過(guò)濾條件移動(dòng)到j(luò)oin的過(guò)濾條件中去,這樣可以減少網(wǎng)絡(luò)數(shù)據(jù)量。
- join執(zhí)行順序都是從左到右,不管是那種join方式,那么一般將大的表放到右邊,這樣可以節(jié)省內(nèi)存&減少網(wǎng)絡(luò)傳輸。
- mapjoin只適合連接表是小表的情況,是一種空間換時(shí)間的解決方案。
內(nèi)連接語(yǔ)法
內(nèi)連接(JOIN)主要作用是獲取連接的兩張表全部匹配的數(shù)據(jù),如果不給定join_condition的話,會(huì)進(jìn)行笛卡爾乘積。
笛卡爾連接(CROSS JOIN)和內(nèi)連接語(yǔ)法一樣,區(qū)別在于:笛卡爾連接是對(duì)內(nèi)連接的一種優(yōu)化。
語(yǔ)法格式為:
table_reference [cross] join table_factor [join_condition]
外連接語(yǔ)法
外連接的主要作用是保留一部分沒(méi)有匹配的數(shù)據(jù)。
左外連接(LEFT OUTER JOIN)的結(jié)果是包括左表中的所有行,如果左表中的某一個(gè)行在右表中不存在,那么則在相關(guān)聯(lián)的結(jié)果集中右表的所有選擇列值均設(shè)置為空值。
右外連接(RIGHT OUTER JOIN)就是左外連接的反先連接,將返回右表的所有行,左表進(jìn)行空值填充。
全外連接(FULL OUTER JOIN)返回左表和右表的所有行,關(guān)聯(lián)表中沒(méi)有匹配值的直接設(shè)置為空值。
語(yǔ)法格式為:
table_reference {left|right|full} [outer] join table_factor join_condition
半連接語(yǔ)法
半連接(LEFT SEMI JOIN)是hive特有的,hive中不支持in/exists操作,所以hive提供了一個(gè)替代方案。
需要注意的是,被連接的表(右表),不能出現(xiàn)在查詢列/其他部分(where等)中,只能出現(xiàn)在on字句中。(出現(xiàn)也是無(wú)效的)。
提出半連接的主要作用其實(shí)是提高查詢效率,真正來(lái)講的話,hive中可以使用其他連接方式來(lái)代替半連接,但是就效率而已的話,還是半連接比較高效。
語(yǔ)法格式:
table_reference LEFT SEMI JOIN table_factor join_condition
mapjoin
如果所有被連接的表都是小表,那么可以使用mapjoin,將需要連接的表數(shù)據(jù)全部讀入mapper端內(nèi)存中。
也就是說(shuō)你使用mapjoin的前提就是你的連接數(shù)據(jù)比較小,mapjoin需要和其他join方式一起使用,一般情況下使用mapjoin的時(shí)候,推薦使用內(nèi)連接。
語(yǔ)法格式為:
select /*+ MAPJOIN(table_ref1) */ ... from table_ref join table_ref1 on ....;
子查詢語(yǔ)法
Hive對(duì)子查詢的支持有限,只支持嵌套select子句,而且只能在from和with語(yǔ)句塊中使用子查詢。
語(yǔ)法規(guī)則如下:
.... from (select statement) [[as] tmp_name]....
導(dǎo)出數(shù)據(jù)
Hive中導(dǎo)出數(shù)據(jù)主要分為兩大類(lèi),
分別是導(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ù)(不過(guò)該方式也是導(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)出到多個(gè)文件夾中,同多表同時(shí)導(dǎo)入數(shù)據(jù)一樣。
其他常用命令&組件
union: 進(jìn)行數(shù)據(jù)合并,格式為:
select1 union all select2... union all selectn
explain: hql執(zhí)行計(jì)劃查詢。格式為: explain hql
hive -e "hql"
:在linux系統(tǒng)中執(zhí)行hive語(yǔ)句。
hive -f "filepath"
: 執(zhí)行l(wèi)inux系統(tǒng)中的包含hive語(yǔ)句的文件。
view:hive支持視圖的使用,單只支持邏輯視圖,不支持物理視圖。
使用語(yǔ)法和table類(lèi)型,創(chuàng)建語(yǔ)法格式為: create view viewname as select_statement