站內(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語(yǔ)句中不能有注釋
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)來(lái)忽略這個(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之外卻無(wú)法使用旬牲。
--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 *
如果沒(méi)有提供表名堕仔,視圖列的名字將由定義的SELECT表達(dá)式自動(dòng)生成;如果修改基本表的屬性晌区,視圖中不會(huì)體現(xiàn)摩骨,無(wú)效查詢將會(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ù)告:查表----------------
沒(méi)有比人更高的山,比腳更長(zhǎng)的路~
第二章 表查詢操作(DQL數(shù)據(jù)查詢腳本)
2018.11.28?基本的Select語(yǔ)法
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)排序昙楚,如果有超過(guò)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ū),通過(guò)分區(qū)可以避免掃全表數(shù)據(jù)淳梦,從而提高數(shù)據(jù)查詢速度析砸,分區(qū)限制在where語(yǔ)句中使用
--------------我是可愛的分割線,下期預(yù)告:表關(guān)聯(lián)----------------
人的一生爆袍,總是為了追尋生命中的光首繁,而走在漫長(zhǎng)的旅途中~
第三章 表關(guān)聯(lián)查詢
在表設(shè)計(jì)的過(guò)程作郭,考慮表的冗余程度、速度等原因蛮瞄,更多的是面向?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
3.1.3 full join
Select? a.*? from? tableA? a? full join? tableB b? on?a.id=b.id
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 子句中寫過(guò)濾條件舵揭,或是在 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