hive hql文档_30分钟入门 Hive SQL(HQL 入门篇)
Hive SQL 幾乎是每一位互聯(lián)網(wǎng)分析師的必備技能,相信每一位面試過大廠的童鞋都有被面試官問到 Hive 優(yōu)化問題的經(jīng)歷。所以掌握扎實的 HQL 基礎(chǔ)尤為重要,既能幫分析師在日常工作中“如魚得水”提高效率,也能在跳槽時獲得一份更好的工作 offer。
本篇為 Hive 入門篇,主要為 Hive SQL 基礎(chǔ)語法介紹,文章爭取做到言簡意賅,讓大家 30 分鐘入門 HQL。
文中視角多處 HQL 對比 關(guān)系型數(shù)據(jù)庫 SQL,適合有一定 SQL 基礎(chǔ)的童鞋。(未掌握基礎(chǔ) SQL 童鞋請移步「w3c school - SQL」快速上手 SQL)
---------- Hive 優(yōu)化篇敬請期待
一、Hive 介紹
簡單來說,Hive 是基于 Hadoop 的一個數(shù)據(jù)倉庫工具。
Hive 的計算基于 Hadoop 實現(xiàn)的一個特別的計算模型 MapReduce,它可以將計算任務(wù)分割成多個處理單元,然后分散到一群家用或服務(wù)器級別的硬件機器上,降低成本并提高水平擴展性。
Hive 的數(shù)據(jù)存儲在 Hadoop 一個分布式文件系統(tǒng)上,即 HDFS。
需明確的是,Hive 作為數(shù)倉應(yīng)用工具,對比 RDBMS(關(guān)系型數(shù)據(jù)庫) 有3個“不能”:不能像 RDBMS 一般實時響應(yīng),Hive 查詢延時大;
不能像 RDBMS 做事務(wù)型查詢,Hive 沒有事務(wù)機制;
不能像 RDBMS 做行級別的變更操作(包括插入、更新、刪除)。
另外,Hive 相比 RDBMS 是一個更“寬松”的世界,比如:Hive 沒有定長的 varchar 這種類型,字符串都是 string;
Hive 是讀時模式,它在保存表數(shù)據(jù)時不會對數(shù)據(jù)進行校驗,而是在讀數(shù)據(jù)時校驗不符合格式的數(shù)據(jù)設(shè)置為NULL。
二、Hive 查詢語句
Hive select 常規(guī)語法與 Mysql 等 RDBMS SQL 幾乎無異,下面附注語法格式,具體不做詳細(xì)講解。本節(jié)重點介紹 Hive 中出現(xiàn)的一些比較特殊且日常中我有用到的一些技巧給到大家參考。
2.1 附注 select 語法及語序,
SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM table_reference
[WHERE where_condition]
[GROUP BY col_list]
[ORDER BY order_condition]
[DISTRIBUTE BY distribute_condition [SORT BY sort_condition] ]
[LIMIT number]
2.2 多維度聚合分析 grouping sets/cube/roolup,
以一個示例來說明 3者作用及區(qū)別。request 表為后端請求表,現(xiàn)需分別統(tǒng)計3種不同維度的聚合:總共多少請求?不同系統(tǒng)、設(shè)備多少請求?不同城市多少請求。
不使用多維聚合方法,
SELECT NULL, NULL, NULL, COUNT(*)
FROM requests
UNION ALL
SELECT os, device, NULL, COUNT(*)
FROM requests GROUP BY os, device
UNION ALL
SELECT null, null, city, COUNT(*)
FROM requests GROUP BY city;
使用 grouping sets,
SELECT os, device, city ,COUNT(*)
FROM requests
GROUP BY os, device, city GROUPING SETS((os, device), (city), ());
cube 會枚舉指定列的所有可能組合作為 grouping sets,而 roolup 會以按層級聚合的方式產(chǎn)生 grouping sets。如,
GROUP BY CUBE(a, b, c)
--等價于以下語句。
GROUPING SETS((a,b,c),(a,b),(a,c),(b,c),(a),(b),(c),())
GROUP BY ROLLUP(a, b, c)
--等價于以下語句。
GROUPING SETS((a,b,c),(a,b),(a), ())
2.3 正則方法指定 select 字段列
說是指定,其實是排除,如:`(num|uid)?+.+` 排除 num 和 uid 字段列。
另外,where 使用正則可以如此:where A Rlike B、where A Regexp B。
2.4 Lateral View(一行變多行)
Lateral View 和表生成函數(shù)(例如Split、Explode等函數(shù))結(jié)合使用,它能夠?qū)⒁恍袛?shù)據(jù)拆成多行數(shù)據(jù),并對拆分后的數(shù)據(jù)進行聚合。
假設(shè)您有一張表pageAds,它有兩列數(shù)據(jù),第一列是pageid string,第二列是adid_list,即用逗號分隔的廣告ID集合。
現(xiàn)需要統(tǒng)計所有廣告在所有頁面的出現(xiàn)次數(shù),則先用 Lateral View + explode 做處理,即可正常分組聚合統(tǒng)計。
SELECT pageid, adid
FROM pageAds LATERAL VIEW explode(adid_list) adTable AS adid;
2.5 窗口函數(shù)
Hive 的窗口函數(shù)非常豐富,這在很多 RDBMS 中是少見的。(至少在 mysql 的較早期版本一直沒有支持窗口函數(shù),一個分組排序得用上非常復(fù)雜的 SQL 自定義變量)
其中最常用的窗口函數(shù)當(dāng)屬 row_number() over(partition by col order col_2),它可以實現(xiàn)按指定字段的分組排序。
其它更豐富的窗口函數(shù),我這不贅述,篇幅太大,完全可以重開一篇新的文章。建議參考阿里云 MaxCompute 的這份「窗口函數(shù)」的文檔,寫得非常詳細(xì),強烈推薦!
2.6 代碼復(fù)用CTE復(fù)用:with t1 as();
阿里云 MaxCompute 支持創(chuàng)建 SQL Script 腳本:允許使用 @var:= 方式創(chuàng)建變量,實現(xiàn)復(fù)用。
with t1 as(
select user_id
from user
where ...
)
@var:= select
shop_id
from shop
where ...;
select *
from user_shop
where user_id in(select * from t1)
and shop_id in(select * from @var);
三、Hive 定義語句(DDL)
3.1 Hive 建表語句格式,
方法一:獨立聲明
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
[(col_name data_type [DEFAULT value] [COMMENT col_comment], ...)]
[COMMENT table_comment]
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
[CLUSTERED BY (col_name [, col_name, ...]) [SORTED BY (col_name [ASC | DESC] [, col_name [ASC | DESC] ...])] INTO number_of_buckets BUCKETS]
[STORED BY StorageHandler] -- 僅限外部表
[WITH SERDEPROPERTIES (Options)] -- 僅限外部表
[LOCATION OSSLocation]; -- 僅限外部表
[LIFECYCLE days]
[AS select_statement]
方法二:從已有表直接復(fù)制
CREATE TABLE [IF NOT EXISTS] table_name
LIKE existing_table_name
下面對當(dāng)中關(guān)鍵的聲明語句做解釋:[EXTERNAL]:聲明為外部表,往往在該表需要被多個工具共享時聲明,外部表刪表不會刪數(shù)據(jù),只會刪元數(shù)據(jù)。
col_name datatype:data_type 一定要嚴(yán)謹(jǐn)定義,避免 bigint、double 等等統(tǒng)統(tǒng)用 string 的偷懶做法,否則不知某天數(shù)據(jù)就出錯了。(團隊內(nèi)曾有同事犯過此錯誤)
[if not exists]:創(chuàng)建時不指定,若存在同名表則返回出錯。指定此選項,若存在同名表忽略后續(xù),不存在則創(chuàng)建。
[DEFAULT value]:指定列的默認(rèn)值,當(dāng)INSERT操作不指定該列時,該列寫入默認(rèn)值。
[PARTITIONED BY]:指定表的分區(qū)字段,當(dāng)利用分區(qū)字段對表進行分區(qū)時,新增分區(qū)、更新分區(qū)內(nèi)數(shù)據(jù)和讀取分區(qū)數(shù)據(jù)均不需做全表掃描,可以提高處理效率。
[LIFECYCLE]:是表的生命周期,分區(qū)表則每個分區(qū)的生命周期與表生命周期相同
[AS select_statement]:意味著可直接跟 select 語句插入數(shù)據(jù)
簡單示例:創(chuàng)建表sale_detail來保存銷售記錄,該表使用銷售時間 sale_date 和銷售區(qū)域 region 作為分區(qū)列。
create table if not exists sale_detail
(
shop_name string,
customer_id string,
total_price double
)
partitioned by (sale_date string, region string);
創(chuàng)建成功的表可以通過 desc 查看定義信息,
desc ;
desc extended ; --查看外部表信息。
如果需要不記得完整的表名,可以通過 show tables 在 db(數(shù)據(jù)庫)范圍內(nèi)查找,
use db_name;
show tables ('tb.*'); --- tb.* 為正則表達(dá)式
3.2 Hive 刪表語句格式,
DROP TABLE [IF EXISTS] table_name; --- 刪除表
ALTER TABLE table_name DROP [IF EXISTS] PARTITION (partition_col1 = partition_col_value1, ...); --- 刪除某分區(qū)
3.3 Hive 變更表定義語句格式,
ALTER TABLE table_name RENAME TO table_name_new; --- 重命名表
ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION (partition_col1 = partition_col_value1 ...); --- 增加分區(qū)
ALTER TABLE table_name ADD COLUMNS (col_name1 type1 comment 'XXX'); --- 增加列,同時定義類型與注釋
ALTER TABLE table_name CHANGE COLUMN old_col_name new_col_name column_type COMMENT column_comment; --- 修改列名和注釋
ALTER TABLE table_name SET lifecycle days; --- 修改生命周期
四、Hive 操作語句
Hive insert語句格式,
INSERT OVERWRITE|INTO TABLE tablename [PARTITION (partcol1=val1...]
select_statement
FROM from_statement;
下面對當(dāng)中關(guān)鍵的聲明語句做解釋:into|overwrite:into-直接向表或表的分區(qū)中追加數(shù)據(jù);先清空表中的原有數(shù)據(jù),再向表或分區(qū)中插入數(shù)據(jù)。
[PARTITION (partcol1=val1...]:不允許使用函數(shù)等表達(dá)式,只能是常量。
關(guān)于 PARTITION 這里展開說明指定分區(qū)插入和動態(tài)分區(qū)插入,輸出到指定分區(qū):在INSERT語句中直接指定分區(qū)值,將數(shù)據(jù)插入指定的分區(qū)。
輸出到動態(tài)分區(qū):在INSERT語句中不直接指定分區(qū)值,只指定分區(qū)列名。分區(qū)列的值在SELECT子句中提供,系統(tǒng)自動根據(jù)分區(qū)字段的值將數(shù)據(jù)插入到相應(yīng)分區(qū)。
以上為 Hive 入門篇,希望對分析師的你有幫助。
若著有幫助,各位鐵子多點贊、收藏!!!
下一期,鐘家福:30分鐘掌握 Hive SQL 優(yōu)化(解決數(shù)據(jù)傾斜)?zhuanlan.zhihu.com
敬請期待。
總結(jié)
以上是生活随笔為你收集整理的hive hql文档_30分钟入门 Hive SQL(HQL 入门篇)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: lenovo服务器换系统重装系统_如何给
- 下一篇: mysql 主从同步 工具_mysql主