日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

hive hql文档_30分钟入门 Hive SQL(HQL 入门篇)

發(fā)布時間:2025/3/20 数据库 72 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hive hql文档_30分钟入门 Hive SQL(HQL 入门篇) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。