Hive---DDL
文章目錄
- 1.hive數據類型
- 1.1 原生數據類型
- 1.2 復雜數據類型
- 1.3 數據類型轉換
- 2.Hive讀寫機制
- 2.1 SerDe
- 2.2 hive讀取文件機制
- 2.3 hive寫文件機制
- 2.4 SerDe語法
- 3.Hive存儲路徑
- 3.1 指定存儲路徑
- 4.Hive建表高階
- 4.1 hive內部表、外部表
- 4.2 分區表
- 4.2.1 靜態分區
- 4.2.2 動態分區
- 4.2.3 分區表的注意事項
- 4.2.4 多重分區
- 4.3 分桶表
- 4.3.1 分桶表的語法
- 4.3.2 分桶表的數據加載
- 4.3.3 分桶表的好處
- 4.4 事務表
- 4.4.1 操作事務表
- 4.5 Hive View
- 4.5.1 操作視圖
- 4.5.2 視圖的優點
- 4.6 物化視圖
- 4.6.1 物化視圖和視圖的區別
- 4.6.2 語法
- 4.6.3 基于物化視圖的查詢重寫
1.hive數據類型
hive的數據類型分為兩種:
1.原生數據類型:數值類型、時間類型、字符串類型、雜項數據類型。
2.復雜數據類型:array數組、map映射、struct結構、union聯合體。
1.1 原生數據類型
1.2 復雜數據類型
1.3 數據類型轉換
HQL支持隱式和顯示轉換,原生類型從窄類型到寬類型的轉換稱為隱式轉換,反之,則不允許。
下表描述了類型之間允許的隱式轉換:
2.Hive讀寫機制
2.1 SerDe
SerDe是Serializer、DeSerializer的簡稱,目的是用于序列化和反序列化。序列化是將對象轉化為字節碼的過程,序列化是將字節碼轉化為對象的過程。
2.2 hive讀取文件機制
首先調用InputFileFormat(在hdfs中默認為TextInputFormat按行讀取),返回一條條kv鍵值對記錄,然后調用SerDe的Deserializer將字節序列轉換為對象,然后將一條記錄中的value根據分隔符切分為各個字段。
2.3 hive寫文件機制
將行寫入文件時,首先調用serde的Serializer將對象轉換為字節序列,然后調用OutputFileFormat將數據寫入HDFS文件。
2.4 SerDe語法
LazySimpleSerDe是Hive默認的序列化類,包含四種子語法,分別用于指定字段之間、集合元素之間、Map映射kv之間、換行之間的分隔符符號。如
row format delimited fileds terminated by ',';字段之間默認的分隔符是’\001’,是一種特殊的字符,使用的是ascii編碼的值,鍵盤無法打出。
3.Hive存儲路徑
Hive表默認存儲路徑默認值為/user/hive/warehouse
3.1 指定存儲路徑
在hive建表的時候,可以通過location語法來更改數據在HDFS上的路徑,使得建表加載數據更加靈活。
4.Hive建表高階
4.1 hive內部表、外部表
內部表(Internal table)也稱為被Hive擁有和管理的托管表(Managed table)。默認情況下創建的表就是內部表,Hive擁有該表的結構和文件。換句話說,Hive完全管理表(元數據和數據)的生命周期,類似于RDBMS中的表。當您刪除內部表時,它會刪除數據以及表的元數據。
外部表(External table)中的數據不是Hive擁有或管理的,只管理表元數據的生命周期。要創建一個外部表,需要使用EXTERNAL語法關鍵字。刪除外部表只會刪除元數據,而不會刪除實際數據。在Hive外部仍然可以訪問實際數據。而且外部表更為方便的是可以搭配location語法指定數據的路徑。
外部表創建:使用external進行修飾
4.2 分區表
現有一張表t_all_hero,同時映射加載了六份數據文件(分別記錄了王者榮耀中六種位置的英雄的相關信息)。
如果不對表進行分區,那么在執行查詢的時候,會對全表進行檢索才能得出相應的結果,如果數據文件很多的話,則會大大降低查詢效率,此時可以通過對表進行分區,避免查詢時候全表掃描數據,極大的提升了查詢效率。此外,hive支持根據用戶指定的字段進行分區。
分區建表語法:
4.2.1 靜態分區
靜態分區:指的是分區的字段值是由用戶在加載數據的時候手動指定的。
語法如下:
4.2.2 動態分區
向分區表中加載數據時,如果需要創建的分區很多,則會復制修改很多sql去執行,效率低。因為hive是批處理系統,所以hive提供了一個動態分區功能,即根據查詢參數的位置去推斷分區的名稱,從而建立分區
動態分區:分區的字段值是根據查詢結果自動推斷出來的。
啟動hive分區之前,需要在hive會話中設置兩個參數:
嚴格模式要求至少有一個分區為靜態分區
案例:
//創建一張新的分區表t_all_hero_part_dynamic create table t_all_hero_part_dynamic(id int,name string,hp_max int,mp_max int,attack_max int,defense_max int,attack_range string,role_main string,role_assist string ) partitioned by (role string) row format delimited fields terminated by "\t"; //執行動態分區插入,tmp.*表示插入的總數據,tmp.role_main表示分區值,即查詢參數的位置 insert into table t_all_hero_part_dynamic partition(role) select tmp.*,tmp.role_main from t_all_hero tmp;注意:tmp.*和tmp.role_main位置不可顛倒
4.2.3 分區表的注意事項
一、 分區表不是建表的必要語法規則,是一種優化手段表,可選;
二、 分區字段不能是表中已有的字段,不能重復;
三、 分區字段是虛擬字段,其數據并不存儲在底層的文件中;
四、 分區字段值的確定來自于用戶價值數據手動指定(靜態分區)或者根據查詢結果位置自動推斷(動態分區)
五、 Hive支持多重分區,也就是說在分區的基礎上繼續分區,劃分更加細粒度
4.2.4 多重分區
多重分區下,分區之間是一種遞進關系,可以理解為在前一個分區的基礎上繼續分區。從HDFS的角度來看就是文件夾下繼續劃分子文件夾。比如:把全國人口數據首先根據省進行分區,然后根據市進行劃分,如果你需要甚至可以繼續根據區縣再劃分,此時就是3分區表。
//雙分區表,按省份和市分區 create table t_user_province_city (id int, name string, age int) partitioned by (province string, city string);load data local inpath '文件路徑' into table t_user_province_city partition(province='zhejiang',city='hangzhou');4.3 分桶表
分桶表也叫做桶表,源自建表語法中bucket單詞。是一種用于優化查詢而設計的表類型。該功能可以讓數據分解為若干個部分易于管理。
在分桶時,我們要指定根據哪個字段將數據分為幾桶(幾個部分)。默認規則是:Bucket number = hash_function(bucketing_column) mod num_buckets。
可以發現桶編號相同的數據會被分到同一個桶當中。hash_function取決于分桶字段bucketing_column的類型:
如果是int類型,hash_function(int) == int;
如果是其他類型,比如bigint,string或者復雜數據類型,hash_function比較棘手,將是從該類型派生的某個數字,比如hashcode值。
4.3.1 分桶表的語法
CREATE [EXTERNAL] TABLE [db_name.]table_name [(col_name data_type, ...)] CLUSTERED BY (col_name) INTO N BUCKETS;其中CLUSTERED BY (col_name)表示根據哪個字段進行分;INTO N BUCKETS表示分為幾桶(也就是幾個部分)。需要注意的是,分桶的字段必須是表中已經存在的字段。
4.3.2 分桶表的數據加載
//開啟分桶的功能 從Hive2.0開始不再需要設置 set hive.enforce.bucketing=true;//把源數據加載到普通hive表中 CREATE TABLE itcast.t_usa_covid19(count_date string,county string,state string,fips int,cases int,deaths int) row format delimited fields terminated by ","; //將源數據上傳到HDFS,t_usa_covid19表對應的路徑下 hadoop fs -put us-covid19-counties.dat /user/hive/warehouse/itcast.db/t_usa_covid19//使用insert+select語法將數據加載到分桶表中 insert into t_usa_covid19_bucket select * from t_usa_covid19;分桶表將數據分為了五個部分:
4.3.3 分桶表的好處
1、基于分桶字段查詢時,減少全表掃描
2、JOIN時可以提高MR程序效率,減少笛卡爾積數量
3、分桶表數據進行抽樣
4.4 事務表
hive中通過事務解決以下問題:
1.流式傳輸數據
使用如Apache Flume或Apache Kafka之類的工具將數據流式傳輸到Hadoop集群中。雖然這些工具可以每秒數百行或更多行的速度寫入數據,但是Hive只能每隔15分鐘到一個小時添加一次分區。頻繁添加分區會很快導致表中大量的分區。因此通常使用這些工具將數據流式傳輸到現有分區中,但是這會使讀者感到臟讀(也就是說,他們將在開始查詢后看到寫入的數據),并將許多小文件留在目錄中,這將給NameNode帶來壓力。通過事務功能,同時允許讀者獲得一致的數據視圖并避免過多的文件。
2.尺寸變化緩慢(例如:表結構變化)
在典型的星型模式數據倉庫中,維度表隨時間緩慢變化。例如,零售商將開設新商店,需要將其添加到商店表中,或者現有商店可能會更改其平方英尺或某些其他跟蹤的特征。這些更改導致插入單個記錄或更新 記錄(取決于所選策略)。
3.數據重述
有時發現收集的數據不正確,需要更正。從Hive 0.14開始,可以通過INSERT,UPDATE和 DELETE支持這些用例 。
hive中的事務的限制:
? 尚不支持BEGIN,COMMIT和ROLLBACK。所有語言操作都是自動提交的。
? 僅支持ORC文件格式(STORED AS ORC)。
? 默認情況下事務配置為關閉。需要配置參數開啟使用。
? 表必須是分桶表(Bucketed)才可以使用事務功能。
? 表參數transactional必須為true;
? 外部表不能成為ACID表,不允許從非ACID會話讀取/寫入ACID表。
4.4.1 操作事務表
--Hive中事務表的創建使用 --1、開啟事務配置(可以使用set設置當前session生效 也可以配置在hive-site.xml中) set hive.support.concurrency = true; --Hive是否支持并發 set hive.enforce.bucketing = true; --從Hive2.0開始不再需要 是否開啟分桶功能 set hive.exec.dynamic.partition.mode = nonstrict; --動態分區模式 非嚴格 set hive.txn.manager = org.apache.hadoop.hive.ql.lockmgr.DbTxnManager; -- set hive.compactor.initiator.on = true; --是否在Metastore實例上運行啟動線程和清理線程 set hive.compactor.worker.threads = 1; --在此metastore實例上運行多少個壓縮程序工作線程。--2、創建Hive事務表 create table trans_student(id int,name String,age int )clustered by (id) into 2 buckets stored as orc TBLPROPERTIES('transactional'='true');--3、針對事務表進行insert update delete操作 insert into trans_student (id, name, age) values (1,"allen",18);update trans_student set age = 20 where id = 1;delete from trans_student where id =1;//查詢事務表 select * from trans_student;4.5 Hive View
Hive中的視圖(view)是一種虛擬表,只保存定義,不實際存儲數據。通常從真實的物理表查詢中創建生成視圖,也可以從已經存在的視圖上創建新視圖。
創建視圖時,將凍結視圖的架構,如果刪除或更改基礎表,則視圖將失敗,并且視圖不能存儲數據,操作數據,只能查詢。
4.5.1 操作視圖
--hive中有一張真實的基礎表t_usa_covid19 select * from itcast.t_usa_covid19;--1、創建視圖 create view v_usa_covid19 as select count_date, county,state,deaths from t_usa_covid19 limit 5;--能否從已有的視圖中創建視圖呢 可以的 create view v_usa_covid19_from_view as select * from v_usa_covid19 limit 2;--2、顯示當前已有的視圖 show tables; show views;--hive v2.2.0之后支持--3、視圖的查詢使用 select * from v_usa_covid19;--能否插入數據到視圖中呢? --不行 報錯 SemanticException:A view cannot be used as target table for LOAD or INSERT insert into v_usa_covid19 select count_date,county,state,deaths from t_usa_covid19;--4、查看視圖定義 show create table v_usa_covid19;--5、刪除視圖 drop view v_usa_covid19_from_view; --6、更改視圖屬性 alter view v_usa_covid19 set TBLPROPERTIES ('comment' = 'This is a view'); --7、更改視圖定義 alter view v_usa_covid19 as select county,deaths from t_usa_covid19 limit 2;4.5.2 視圖的優點
1.提高數據的安全性,只將特定列的數據展示給用戶
2.降低查詢的復雜度,優化查詢語句
4.6 物化視圖
在傳統的數據庫領域基本已經都實現了物化視圖, 屬于數據庫的高級功能。物化視圖(Materialized View)是一個包括查詢結果的數據庫對像,可以用于預先計算并保存表連接或聚集等耗時較多的操作的結果。這樣,在執行查詢時,就可以避免進行這些耗時的操作,而從快速的得到結果。
4.6.1 物化視圖和視圖的區別
視圖是虛擬的,邏輯存在的,只有定義沒有存儲數據。
物化視圖是真實的,物理存在的,里面存儲著預計算的數據。
視圖的目的是簡化降低查詢的復雜度,而物化視圖的目的是提高查詢性能。
4.6.2 語法
--物化視圖的創建語法 CREATE MATERIALIZED VIEW [IF NOT EXISTS] [db_name.]materialized_view_name[DISABLE REWRITE][COMMENT materialized_view_comment][PARTITIONED ON (col_name, ...)][CLUSTERED ON (col_name, ...) | DISTRIBUTED ON (col_name, ...) SORTED ON (col_name, ...)][[ROW FORMAT row_format][STORED AS file_format]| STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)]][LOCATION hdfs_path][TBLPROPERTIES (property_name=property_value, ...)] AS SELECT ...;4.6.3 基于物化視圖的查詢重寫
物化視圖創建后即可用于相關查詢的加速,用戶提交查詢query,若該query經過重寫后可命中已建視圖,則被重寫命中相關已建視圖實現查詢加速。
是否重寫查詢使用物化視圖可以通過全局參數控制,默認為true:
用戶可選擇性的失能物化視圖的重寫:
ALTER MATERIALIZED VIEW [db_name.]materialized_view_name ENABLE|DISABLE REWRITE;總結
以上是生活随笔為你收集整理的Hive---DDL的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Day10.事件下(学习日记10)
- 下一篇: 俞伯牙摔琴谢知音的故事