Hive教程 | 從0到1

站內(nèi)有朋友私信數(shù)據(jù)產(chǎn)品經(jīng)理都需要掌握哪些技能和工具,我給他們的回答:1.數(shù)據(jù)提取得會(huì):hive 2.數(shù)據(jù)清洗和整理:hive+Excel+Python 3.數(shù)據(jù)統(tǒng)計(jì)分析:Excel+SPSS+Python 4.數(shù)據(jù)展示:Excel+PPT+tableau

本文開啟hive的基礎(chǔ)教程和進(jìn)階(長(zhǎng)更,有需要的朋友收藏便于閱讀)

2018.10.06 建表

第一章 表基礎(chǔ)操作(DDL操作+DML元數(shù)據(jù)存儲(chǔ))

1.1創(chuàng)建分區(qū)表 注意:set語句中不能有注釋

set hive.exec.dynamic.partition.mode=nonstrict; --動(dòng)態(tài)分區(qū)

set hive.exec.dynamic.partition=true;? --動(dòng)態(tài)分區(qū)(partition的字段是動(dòng)態(tài)查詢寫入的)

set hive.exec.max.dynamic.partitions=100000; --總共的最大的動(dòng)態(tài)分區(qū)數(shù)

set hive.exec.max.dynamic.partitions.pernode=100000;--每個(gè)節(jié)點(diǎn)上能夠生成的最大分區(qū),這個(gè)在最壞情況下應(yīng)該是跟最大分區(qū)一樣的值

set hive.exec.max.created.files=500000;? --是能夠創(chuàng)建的最多文件數(shù)(分區(qū)一多,文件必然就多了...)

CREATE EXTERNAL TABLE IF NOT EXISTS data_zhp( --如果相同名字的表已經(jīng)存在,則拋出異常;用戶可以用 IF NOT EXIST 選項(xiàng)來忽略這個(gè)異常

ROWKEY STRING,

STATION INT,

MONTH INT,

DAY INT

HOUR INT ,

MINUTE INT,

)

COMMENT 'ECLP開放預(yù)測(cè)'

PARTITIONED BY (YEAR INT)

ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' --聲明文件分隔符

LINES TERMINATED BY '\n' --聲明各條記錄分隔符

STORED AS TEXTFILE;

--Hive數(shù)據(jù)文件的存儲(chǔ)格式,這里使用的是TEXTFILE,還有SEQUENCEFILE和RCFile,一共三種。

--TEXTFILE是最普通的文件存儲(chǔ)格式,內(nèi)容是可以直接查看。

--SEQUCENFILE是包含鍵值對(duì)的二進(jìn)制的文件存儲(chǔ)格式,支持壓縮,可以節(jié)省存儲(chǔ)空間。是hadoop領(lǐng)域的標(biāo)準(zhǔn)文件格式,但是在hadoop之外卻無法使用。

--RCFile是列式存儲(chǔ)文件格式,適合壓縮處理。對(duì)于有成百上千字段的表而言,RCFile更加合適。

 1.2復(fù)制空表與復(fù)制表及數(shù)據(jù)

CREATE TABLE sku_id_copy?LIKE sku_id;

CREATE TABLE sku_id_copy?as

select

*

from sku_id;

2018.10.14 表基礎(chǔ)操作增刪改

1.3表的增刪改

增加一列

ALTER TABLE dev_linshibiao? ADD???COLUMNS (new_col string)

刪除dept_id_1\ model列

ALTER TABLE dev_linshibiao? REPLACE COLUMNS (op_time string, dept_name_1string, cw_gmv double)

增加分區(qū)

ALTER TABLE dev_linshibiao? ADD???PARTITION (dt=‘2016-06-20’)

刪除分區(qū)

ALTER TABLE dev_linshibiao? DROP PARTITION (dt=‘2016-06-20’)

刪除表

DROP TABLE dev_linshibiao

創(chuàng)建/刪除視圖

CREATE VIEW [IF NOT EXISTS] view_name [ (column_name [COMMENT column_comment], ...) ][COMMENT view_comment][TBLPROPERTIES (property_name = property_value, ...)]?AS SELECT *

如果沒有提供表名,視圖列的名字將由定義的SELECT表達(dá)式自動(dòng)生成;如果修改基本表的屬性,視圖中不會(huì)體現(xiàn),無效查詢將會(huì)失??;視圖是只讀的,不能用LOAD/INSERT/ALTER

DROP VIEW view_name??刪除視圖

2018.11.14 表的數(shù)據(jù)插入

1.4表的插入數(shù)據(jù)

分區(qū)表用overwrite:插入前清空分區(qū)

insert overwrite TABLE dev.search_batch_pvuv_zwh partition (dt)

? ? SELECT??*?? ?FROM XXXXX

不分區(qū)的表必須用insert??into

insert??into不清空插入,overwrite插入前清空,表中最后只剩新插入的數(shù)據(jù)

1.5表加載數(shù)據(jù)

LOAD DATA LOCAL INPATH './files/XXX.txt' OVERWRITE INTO TABLE XXXX;

--------------我是可愛的分割線,下期預(yù)告:查表----------------

沒有比人更高的山,比腳更長(zhǎng)的路~

第二章 表查詢操作(DQL數(shù)據(jù)查詢腳本)

2018.11.28?基本的Select語法

2.1基礎(chǔ)查詢

SELECT [ALL | DISTINCT] column1, column2, ...

FROM table_XXXX

[WHERE where_aaaa=XXX]

[GROUP BY column1 [HAVING condition]]

[CLUSTER BY column1| [DISTRIBUTE BY column1] [SORT BY | ORDER BY column1]]

[LIMIT number]

1.使用ALL和DISTINCT選項(xiàng)區(qū)分對(duì)重復(fù)記錄的處理,默認(rèn)是ALL,表示查詢所有記錄;DISTINCT表示去掉重復(fù)的記錄

2.Where 條件,支持 AND,OR ,between,IN, NOT IN,不支持EXIST ,NOT EXIST

3.ORDER BY與SORT BY的不同,ORDER BY 全局排序,只有一個(gè)Reduce任務(wù);SORT BY 只在本機(jī)做排序,前者保證在全局進(jìn)行排序,而后者僅保證在每個(gè)reduce內(nèi)排序,如果有超過1個(gè)reduce,sort by可能有部分結(jié)果有序

CLUSTER BY?和DISTRIBUTE BY主要用在進(jìn)行Transform/Map-Reduce腳本。

4.Limit 可以限制查詢的記錄數(shù),實(shí)現(xiàn)Top n查詢,一般order by 必須攜帶limit使用

2.2hive的分區(qū)查詢

hive表的一個(gè)優(yōu)勢(shì)便是分區(qū),通過分區(qū)可以避免掃全表數(shù)據(jù),從而提高數(shù)據(jù)查詢速度,分區(qū)限制在where語句中使用

--------------我是可愛的分割線,下期預(yù)告:表關(guān)聯(lián)----------------

人的一生,總是為了追尋生命中的光,而走在漫長(zhǎng)的旅途中~

第三章 表關(guān)聯(lián)查詢

在表設(shè)計(jì)的過程,考慮表的冗余程度、速度等原因,更多的是面向?qū)ο蠡蛘呙嫦蛑黝}設(shè)計(jì),所以需要全面的數(shù)據(jù)支持,便需要多表關(guān)聯(lián)查詢完成。

表的關(guān)聯(lián)的兩個(gè)手段為JOIN和UNION ALL

3.1 join

常用的join,left outer join ,right outer join , full join ,left semi join

3.1.1 join

Select? a.*? from? tableA? a? join? tableB b? on a.id=b.id

必須等值鏈接,結(jié)果展示a、b表中共有的id部分

3.1.2?left outer join ,right outer join?

Select? a.*? from? tableA? a? left outer join? tableB b? on??a.id=b.id

left outer join


right outer join?

3.1.3 full join

Select? a.*? from? tableA? a? full join? tableB b? on?a.id=b.id

full join?

3.1.4?left semi join

Select? a.*? from? tableA? a? left semi join? tableB b? on?a.id=b.id

等同于join,但是結(jié)果只顯示a表中字段

join的注意事項(xiàng):

1.實(shí)踐中,應(yīng)該把數(shù)據(jù)量最大的那個(gè)表寫在最后關(guān)聯(lián);

2.限制 join 的輸出,應(yīng)該在 join前WHERE 子句中寫過濾條件,或是在 join 后子句中寫

3.可以 join 多于 2 個(gè)表

4.join容易將數(shù)據(jù)重復(fù)記錄,導(dǎo)致計(jì)算最后結(jié)果錯(cuò)誤

3.2?UNION ALL

相同字段的表直接2表合并

SELECT column_name(s)

FROM table_name1 UNION ALL SELECT column_name(s) FROM table_name2

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容